All of lore.kernel.org
 help / color / mirror / Atom feed
* [PULL 0/6] Audio 20200316 patches
@ 2020-03-16 11:30 Gerd Hoffmann
  2020-03-16 11:30 ` [PULL 1/6] qapi/audio: add documentation for AudioFormat Gerd Hoffmann
                   ` (6 more replies)
  0 siblings, 7 replies; 8+ messages in thread
From: Gerd Hoffmann @ 2020-03-16 11:30 UTC (permalink / raw)
  To: qemu-devel; +Cc: Markus Armbruster, Gerd Hoffmann

The following changes since commit 61c265f0660ee476985808c8aa7915617c44fd53:

  Merge remote-tracking branch 'remotes/dgilbert/tags/pull-migration-20200313a' into staging (2020-03-13 10:33:04 +0000)

are available in the Git repository at:

  git://git.kraxel.org/qemu tags/audio-20200316-pull-request

for you to fetch changes up to 49f77e6faf36cddd84417f9080462413acdbcc27:

  audio: add audiodev format=f32 option documentation (2020-03-16 10:18:07 +0100)

----------------------------------------------------------------
audio: float fixes

----------------------------------------------------------------

Volker Rümelin (6):
  qapi/audio: add documentation for AudioFormat
  audio: change naming scheme of FLOAT_CONV macros
  audio: consistency changes
  audio: change mixing engine float range to [-1.f, 1.f]
  audio: fix saturation nonlinearity in clip_* functions
  audio: add audiodev format=f32 option documentation

 audio/mixeng_template.h | 22 ++++++++++------------
 audio/mixeng.c          | 26 +++++++++++++-------------
 qapi/audio.json         | 14 ++++++++++++++
 qemu-options.hx         |  4 ++--
 4 files changed, 39 insertions(+), 27 deletions(-)

-- 
2.18.2



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

* [PULL 1/6] qapi/audio: add documentation for AudioFormat
  2020-03-16 11:30 [PULL 0/6] Audio 20200316 patches Gerd Hoffmann
@ 2020-03-16 11:30 ` Gerd Hoffmann
  2020-03-16 11:30 ` [PULL 2/6] audio: change naming scheme of FLOAT_CONV macros Gerd Hoffmann
                   ` (5 subsequent siblings)
  6 siblings, 0 replies; 8+ messages in thread
From: Gerd Hoffmann @ 2020-03-16 11:30 UTC (permalink / raw)
  To: qemu-devel; +Cc: Volker Rümelin, Markus Armbruster, Gerd Hoffmann

From: Volker Rümelin <vr_qemu@t-online.de>

The review for patch ed2a4a7941 "audio: proper support for
float samples in mixeng" suggested this would be a good idea.

Acked-by: Markus Armbruster <armbru@redhat.com>
Signed-off-by: Volker Rümelin <vr_qemu@t-online.de>
Tested-by: John Arbuckle <programmingkidx@gmail.com>
Message-id: 20200308193321.20668-1-vr_qemu@t-online.de
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
 qapi/audio.json | 14 ++++++++++++++
 1 file changed, 14 insertions(+)

diff --git a/qapi/audio.json b/qapi/audio.json
index d8c507ccedae..c31251f45b57 100644
--- a/qapi/audio.json
+++ b/qapi/audio.json
@@ -273,6 +273,20 @@
 #
 # An enumeration of possible audio formats.
 #
+# @u8: unsigned 8 bit integer
+#
+# @s8: signed 8 bit integer
+#
+# @u16: unsigned 16 bit integer
+#
+# @s16: signed 16 bit integer
+#
+# @u32: unsigned 32 bit integer
+#
+# @s32: signed 32 bit integer
+#
+# @f32: single precision floating-point (since 5.0)
+#
 # Since: 4.0
 ##
 { 'enum': 'AudioFormat',
-- 
2.18.2



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

* [PULL 2/6] audio: change naming scheme of FLOAT_CONV macros
  2020-03-16 11:30 [PULL 0/6] Audio 20200316 patches Gerd Hoffmann
  2020-03-16 11:30 ` [PULL 1/6] qapi/audio: add documentation for AudioFormat Gerd Hoffmann
@ 2020-03-16 11:30 ` Gerd Hoffmann
  2020-03-16 11:30 ` [PULL 3/6] audio: consistency changes Gerd Hoffmann
                   ` (4 subsequent siblings)
  6 siblings, 0 replies; 8+ messages in thread
From: Gerd Hoffmann @ 2020-03-16 11:30 UTC (permalink / raw)
  To: qemu-devel; +Cc: Volker Rümelin, Markus Armbruster, Gerd Hoffmann

From: Volker Rümelin <vr_qemu@t-online.de>

This patch changes the naming scheme of the FLOAT_CONV_TO and
FLOAT_CONV_FROM macros to the scheme used in mixeng_template.h.

Signed-off-by: Volker Rümelin <vr_qemu@t-online.de>
Message-id: 20200308193321.20668-2-vr_qemu@t-online.de
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
 audio/mixeng.c | 22 +++++++++++-----------
 1 file changed, 11 insertions(+), 11 deletions(-)

diff --git a/audio/mixeng.c b/audio/mixeng.c
index c14b0d874ce5..b57fad83bf3b 100644
--- a/audio/mixeng.c
+++ b/audio/mixeng.c
@@ -268,17 +268,17 @@ f_sample *mixeng_clip[2][2][2][3] = {
 };
 
 #ifdef FLOAT_MIXENG
-#define FLOAT_CONV_TO(x) (x)
-#define FLOAT_CONV_FROM(x) (x)
+#define CONV_NATURAL_FLOAT(x) (x)
+#define CLIP_NATURAL_FLOAT(x) (x)
 #else
 static const float float_scale = UINT_MAX;
-#define FLOAT_CONV_TO(x) ((x) * float_scale)
+#define CONV_NATURAL_FLOAT(x) ((x) * float_scale)
 
 #ifdef RECIPROCAL
 static const float float_scale_reciprocal = 1.f / UINT_MAX;
-#define FLOAT_CONV_FROM(x) ((x) * float_scale_reciprocal)
+#define CLIP_NATURAL_FLOAT(x) ((x) * float_scale_reciprocal)
 #else
-#define FLOAT_CONV_FROM(x) ((x) / float_scale)
+#define CLIP_NATURAL_FLOAT(x) ((x) / float_scale)
 #endif
 #endif
 
@@ -288,7 +288,7 @@ static void conv_natural_float_to_mono(struct st_sample *dst, const void *src,
     float *in = (float *)src;
 
     while (samples--) {
-        dst->r = dst->l = FLOAT_CONV_TO(*in++);
+        dst->r = dst->l = CONV_NATURAL_FLOAT(*in++);
         dst++;
     }
 }
@@ -299,8 +299,8 @@ static void conv_natural_float_to_stereo(struct st_sample *dst, const void *src,
     float *in = (float *)src;
 
     while (samples--) {
-        dst->l = FLOAT_CONV_TO(*in++);
-        dst->r = FLOAT_CONV_TO(*in++);
+        dst->l = CONV_NATURAL_FLOAT(*in++);
+        dst->r = CONV_NATURAL_FLOAT(*in++);
         dst++;
     }
 }
@@ -316,7 +316,7 @@ static void clip_natural_float_from_mono(void *dst, const struct st_sample *src,
     float *out = (float *)dst;
 
     while (samples--) {
-        *out++ = FLOAT_CONV_FROM(src->l) + FLOAT_CONV_FROM(src->r);
+        *out++ = CLIP_NATURAL_FLOAT(src->l) + CLIP_NATURAL_FLOAT(src->r);
         src++;
     }
 }
@@ -327,8 +327,8 @@ static void clip_natural_float_from_stereo(
     float *out = (float *)dst;
 
     while (samples--) {
-        *out++ = FLOAT_CONV_FROM(src->l);
-        *out++ = FLOAT_CONV_FROM(src->r);
+        *out++ = CLIP_NATURAL_FLOAT(src->l);
+        *out++ = CLIP_NATURAL_FLOAT(src->r);
         src++;
     }
 }
-- 
2.18.2



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

* [PULL 3/6] audio: consistency changes
  2020-03-16 11:30 [PULL 0/6] Audio 20200316 patches Gerd Hoffmann
  2020-03-16 11:30 ` [PULL 1/6] qapi/audio: add documentation for AudioFormat Gerd Hoffmann
  2020-03-16 11:30 ` [PULL 2/6] audio: change naming scheme of FLOAT_CONV macros Gerd Hoffmann
@ 2020-03-16 11:30 ` Gerd Hoffmann
  2020-03-16 11:30 ` [PULL 4/6] audio: change mixing engine float range to [-1.f, 1.f] Gerd Hoffmann
                   ` (3 subsequent siblings)
  6 siblings, 0 replies; 8+ messages in thread
From: Gerd Hoffmann @ 2020-03-16 11:30 UTC (permalink / raw)
  To: qemu-devel; +Cc: Volker Rümelin, Markus Armbruster, Gerd Hoffmann

From: Volker Rümelin <vr_qemu@t-online.de>

Change the clip_natural_float_from_mono() function in
audio/mixeng.c to be consistent with the clip_*_from_mono()
functions in audio/mixeng_template.h.

Signed-off-by: Volker Rümelin <vr_qemu@t-online.de>
Message-id: 20200308193321.20668-3-vr_qemu@t-online.de
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
 audio/mixeng.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/audio/mixeng.c b/audio/mixeng.c
index b57fad83bf3b..725b529be7da 100644
--- a/audio/mixeng.c
+++ b/audio/mixeng.c
@@ -316,7 +316,7 @@ static void clip_natural_float_from_mono(void *dst, const struct st_sample *src,
     float *out = (float *)dst;
 
     while (samples--) {
-        *out++ = CLIP_NATURAL_FLOAT(src->l) + CLIP_NATURAL_FLOAT(src->r);
+        *out++ = CLIP_NATURAL_FLOAT(src->l + src->r);
         src++;
     }
 }
-- 
2.18.2



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

* [PULL 4/6] audio: change mixing engine float range to [-1.f, 1.f]
  2020-03-16 11:30 [PULL 0/6] Audio 20200316 patches Gerd Hoffmann
                   ` (2 preceding siblings ...)
  2020-03-16 11:30 ` [PULL 3/6] audio: consistency changes Gerd Hoffmann
@ 2020-03-16 11:30 ` Gerd Hoffmann
  2020-03-16 11:30 ` [PULL 5/6] audio: fix saturation nonlinearity in clip_* functions Gerd Hoffmann
                   ` (2 subsequent siblings)
  6 siblings, 0 replies; 8+ messages in thread
From: Gerd Hoffmann @ 2020-03-16 11:30 UTC (permalink / raw)
  To: qemu-devel; +Cc: Volker Rümelin, Markus Armbruster, Gerd Hoffmann

From: Volker Rümelin <vr_qemu@t-online.de>

Currently the internal float range of the mixing engine is
[-.5f, .5f]. PulseAudio, SDL2 and libasound use a [-1.f, 1.f]
range. This means with float samples the audio playback volume
is 6dB too low and audio recording signals will be clipped in
most cases.

To avoid another scaling factor in the conv_natural_float_* and
clip_natural_float_* functions with FLOAT_MIXENG defined this
patch changes the mixing engine float range to [-1.f, 1.f].

Signed-off-by: Volker Rümelin <vr_qemu@t-online.de>
Message-id: 20200308193321.20668-4-vr_qemu@t-online.de
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
 audio/mixeng_template.h | 17 ++++++++---------
 audio/mixeng.c          |  4 ++--
 2 files changed, 10 insertions(+), 11 deletions(-)

diff --git a/audio/mixeng_template.h b/audio/mixeng_template.h
index 77cc89b9e808..fc8e1d4d9ebf 100644
--- a/audio/mixeng_template.h
+++ b/audio/mixeng_template.h
@@ -41,32 +41,31 @@ static inline mixeng_real glue (conv_, ET) (IN_T v)
 
 #ifdef RECIPROCAL
 #ifdef SIGNED
-    return nv * (1.f / (mixeng_real) (IN_MAX - IN_MIN));
+    return nv * (2.f / ((mixeng_real)IN_MAX - IN_MIN));
 #else
-    return (nv - HALF) * (1.f / (mixeng_real) IN_MAX);
+    return (nv - HALF) * (2.f / (mixeng_real)IN_MAX);
 #endif
 #else  /* !RECIPROCAL */
 #ifdef SIGNED
-    return nv / (mixeng_real) ((mixeng_real) IN_MAX - IN_MIN);
+    return nv / (((mixeng_real)IN_MAX - IN_MIN) / 2.f);
 #else
-    return (nv - HALF) / (mixeng_real) IN_MAX;
+    return (nv - HALF) / ((mixeng_real)IN_MAX / 2.f);
 #endif
 #endif
 }
 
 static inline IN_T glue (clip_, ET) (mixeng_real v)
 {
-    if (v >= 0.5) {
+    if (v >= 1.f) {
         return IN_MAX;
-    }
-    else if (v < -0.5) {
+    } else if (v < -1.f) {
         return IN_MIN;
     }
 
 #ifdef SIGNED
-    return ENDIAN_CONVERT ((IN_T) (v * ((mixeng_real) IN_MAX - IN_MIN)));
+    return ENDIAN_CONVERT((IN_T)(v * (((mixeng_real)IN_MAX - IN_MIN) / 2.f)));
 #else
-    return ENDIAN_CONVERT ((IN_T) ((v * IN_MAX) + HALF));
+    return ENDIAN_CONVERT((IN_T)((v * ((mixeng_real)IN_MAX / 2.f)) + HALF));
 #endif
 }
 
diff --git a/audio/mixeng.c b/audio/mixeng.c
index 725b529be7da..739a500449ce 100644
--- a/audio/mixeng.c
+++ b/audio/mixeng.c
@@ -271,11 +271,11 @@ f_sample *mixeng_clip[2][2][2][3] = {
 #define CONV_NATURAL_FLOAT(x) (x)
 #define CLIP_NATURAL_FLOAT(x) (x)
 #else
-static const float float_scale = UINT_MAX;
+static const float float_scale = UINT_MAX / 2.f;
 #define CONV_NATURAL_FLOAT(x) ((x) * float_scale)
 
 #ifdef RECIPROCAL
-static const float float_scale_reciprocal = 1.f / UINT_MAX;
+static const float float_scale_reciprocal = 2.f / UINT_MAX;
 #define CLIP_NATURAL_FLOAT(x) ((x) * float_scale_reciprocal)
 #else
 #define CLIP_NATURAL_FLOAT(x) ((x) / float_scale)
-- 
2.18.2



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

* [PULL 5/6] audio: fix saturation nonlinearity in clip_* functions
  2020-03-16 11:30 [PULL 0/6] Audio 20200316 patches Gerd Hoffmann
                   ` (3 preceding siblings ...)
  2020-03-16 11:30 ` [PULL 4/6] audio: change mixing engine float range to [-1.f, 1.f] Gerd Hoffmann
@ 2020-03-16 11:30 ` Gerd Hoffmann
  2020-03-16 11:30 ` [PULL 6/6] audio: add audiodev format=f32 option documentation Gerd Hoffmann
  2020-03-16 14:55 ` [PULL 0/6] Audio 20200316 patches Peter Maydell
  6 siblings, 0 replies; 8+ messages in thread
From: Gerd Hoffmann @ 2020-03-16 11:30 UTC (permalink / raw)
  To: qemu-devel; +Cc: Volker Rümelin, Markus Armbruster, Gerd Hoffmann

From: Volker Rümelin <vr_qemu@t-online.de>

The current positive limit for the saturation nonlinearity is
only correct if the type of the result has 8 bits or less.

Signed-off-by: Volker Rümelin <vr_qemu@t-online.de>
Message-id: 20200308193321.20668-5-vr_qemu@t-online.de
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
 audio/mixeng_template.h | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/audio/mixeng_template.h b/audio/mixeng_template.h
index fc8e1d4d9ebf..bc8509e423f6 100644
--- a/audio/mixeng_template.h
+++ b/audio/mixeng_template.h
@@ -83,10 +83,9 @@ static inline int64_t glue (conv_, ET) (IN_T v)
 
 static inline IN_T glue (clip_, ET) (int64_t v)
 {
-    if (v >= 0x7f000000) {
+    if (v >= 0x7fffffffLL) {
         return IN_MAX;
-    }
-    else if (v < -2147483648LL) {
+    } else if (v < -2147483648LL) {
         return IN_MIN;
     }
 
-- 
2.18.2



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

* [PULL 6/6] audio: add audiodev format=f32 option documentation
  2020-03-16 11:30 [PULL 0/6] Audio 20200316 patches Gerd Hoffmann
                   ` (4 preceding siblings ...)
  2020-03-16 11:30 ` [PULL 5/6] audio: fix saturation nonlinearity in clip_* functions Gerd Hoffmann
@ 2020-03-16 11:30 ` Gerd Hoffmann
  2020-03-16 14:55 ` [PULL 0/6] Audio 20200316 patches Peter Maydell
  6 siblings, 0 replies; 8+ messages in thread
From: Gerd Hoffmann @ 2020-03-16 11:30 UTC (permalink / raw)
  To: qemu-devel; +Cc: Volker Rümelin, Markus Armbruster, Gerd Hoffmann

From: Volker Rümelin <vr_qemu@t-online.de>

The documentaion for -audiodev format=f32 option was missing.

Signed-off-by: Volker Rümelin <vr_qemu@t-online.de>
Message-id: 20200308193321.20668-6-vr_qemu@t-online.de
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
 qemu-options.hx | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/qemu-options.hx b/qemu-options.hx
index 1d8f852d8969..962a5ebaa67a 100644
--- a/qemu-options.hx
+++ b/qemu-options.hx
@@ -551,7 +551,7 @@ DEF("audiodev", HAS_ARG, QEMU_OPTION_audiodev,
     "                in|out.frequency= frequency to use with fixed settings\n"
     "                in|out.channels= number of channels to use with fixed settings\n"
     "                in|out.format= sample format to use with fixed settings\n"
-    "                valid values: s8, s16, s32, u8, u16, u32\n"
+    "                valid values: s8, s16, s32, u8, u16, u32, f32\n"
     "                in|out.voices= number of voices to use\n"
     "                in|out.buffer-length= length of buffer in microseconds\n"
     "-audiodev none,id=id,[,prop[=value][,...]]\n"
@@ -647,7 +647,7 @@ SRST
     ``in|out.format=format``
         Specify the sample format to use when using fixed-settings.
         Valid values are: ``s8``, ``s16``, ``s32``, ``u8``, ``u16``,
-        ``u32``. Default is ``s16``.
+        ``u32``, ``f32``. Default is ``s16``.
 
     ``in|out.voices=voices``
         Specify the number of voices to use. Default is 1.
-- 
2.18.2



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

* Re: [PULL 0/6] Audio 20200316 patches
  2020-03-16 11:30 [PULL 0/6] Audio 20200316 patches Gerd Hoffmann
                   ` (5 preceding siblings ...)
  2020-03-16 11:30 ` [PULL 6/6] audio: add audiodev format=f32 option documentation Gerd Hoffmann
@ 2020-03-16 14:55 ` Peter Maydell
  6 siblings, 0 replies; 8+ messages in thread
From: Peter Maydell @ 2020-03-16 14:55 UTC (permalink / raw)
  To: Gerd Hoffmann; +Cc: QEMU Developers, Markus Armbruster

On Mon, 16 Mar 2020 at 11:39, Gerd Hoffmann <kraxel@redhat.com> wrote:
>
> The following changes since commit 61c265f0660ee476985808c8aa7915617c44fd53:
>
>   Merge remote-tracking branch 'remotes/dgilbert/tags/pull-migration-20200313a' into staging (2020-03-13 10:33:04 +0000)
>
> are available in the Git repository at:
>
>   git://git.kraxel.org/qemu tags/audio-20200316-pull-request
>
> for you to fetch changes up to 49f77e6faf36cddd84417f9080462413acdbcc27:
>
>   audio: add audiodev format=f32 option documentation (2020-03-16 10:18:07 +0100)
>
> ----------------------------------------------------------------
> audio: float fixes
>
> ----------------------------------------------------------------


Applied, thanks.

Please update the changelog at https://wiki.qemu.org/ChangeLog/5.0
for any user-visible changes.

-- PMM


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

end of thread, other threads:[~2020-03-16 16:38 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-03-16 11:30 [PULL 0/6] Audio 20200316 patches Gerd Hoffmann
2020-03-16 11:30 ` [PULL 1/6] qapi/audio: add documentation for AudioFormat Gerd Hoffmann
2020-03-16 11:30 ` [PULL 2/6] audio: change naming scheme of FLOAT_CONV macros Gerd Hoffmann
2020-03-16 11:30 ` [PULL 3/6] audio: consistency changes Gerd Hoffmann
2020-03-16 11:30 ` [PULL 4/6] audio: change mixing engine float range to [-1.f, 1.f] Gerd Hoffmann
2020-03-16 11:30 ` [PULL 5/6] audio: fix saturation nonlinearity in clip_* functions Gerd Hoffmann
2020-03-16 11:30 ` [PULL 6/6] audio: add audiodev format=f32 option documentation Gerd Hoffmann
2020-03-16 14:55 ` [PULL 0/6] Audio 20200316 patches Peter Maydell

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.