summaryrefslogtreecommitdiffstats
path: root/audio/mixeng_template.h
diff options
context:
space:
mode:
authorPeter Maydell2020-03-16 14:06:14 +0100
committerPeter Maydell2020-03-16 14:06:14 +0100
commit509f61798b5d1056dfbcbbc64a7c2998740f10d6 (patch)
tree140d946d714d87d8574eeb43f099a2fd9dc669e3 /audio/mixeng_template.h
parentMerge remote-tracking branch 'remotes/dgilbert/tags/pull-migration-20200313a'... (diff)
parentaudio: add audiodev format=f32 option documentation (diff)
downloadqemu-509f61798b5d1056dfbcbbc64a7c2998740f10d6.tar.gz
qemu-509f61798b5d1056dfbcbbc64a7c2998740f10d6.tar.xz
qemu-509f61798b5d1056dfbcbbc64a7c2998740f10d6.zip
Merge remote-tracking branch 'remotes/kraxel/tags/audio-20200316-pull-request' into staging
audio: float fixes # gpg: Signature made Mon 16 Mar 2020 11:30:00 GMT # gpg: using RSA key 4CB6D8EED3E87138 # gpg: Good signature from "Gerd Hoffmann (work) <kraxel@redhat.com>" [full] # gpg: aka "Gerd Hoffmann <gerd@kraxel.org>" [full] # gpg: aka "Gerd Hoffmann (private) <kraxel@gmail.com>" [full] # Primary key fingerprint: A032 8CFF B93A 17A7 9901 FE7D 4CB6 D8EE D3E8 7138 * remotes/kraxel/tags/audio-20200316-pull-request: audio: add audiodev format=f32 option documentation audio: fix saturation nonlinearity in clip_* functions audio: change mixing engine float range to [-1.f, 1.f] audio: consistency changes audio: change naming scheme of FLOAT_CONV macros qapi/audio: add documentation for AudioFormat Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Diffstat (limited to 'audio/mixeng_template.h')
-rw-r--r--audio/mixeng_template.h22
1 files changed, 10 insertions, 12 deletions
diff --git a/audio/mixeng_template.h b/audio/mixeng_template.h
index 77cc89b9e8..bc8509e423 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
}
@@ -84,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;
}