]> git.sesse.net Git - vlc/commitdiff
Deal with saturation correctly for S16N volume
authorRémi Denis-Courmont <remi@remlab.net>
Mon, 26 Sep 2011 20:55:52 +0000 (23:55 +0300)
committerRémi Denis-Courmont <remi@remlab.net>
Mon, 26 Sep 2011 20:55:52 +0000 (23:55 +0300)
modules/audio_mixer/fixed32.c

index ee50d6f01c6c3bdfd21da3a23e5a6b297abebbe4..7a9c8755a65bd8da67ede2b3e4ca3ab1bf764ec1 100644 (file)
@@ -78,17 +78,31 @@ static void FilterFI32 (audio_mixer_t *mixer, block_t *block, float volume)
 
 static void FilterS16N (audio_mixer_t *mixer, block_t *block, float volume)
 {
-    const int32_t mult = volume * 0x10000;
+    int32_t mult = volume * 0x1.p16;
 
     if (mult == 0x10000)
         return;
 
     int16_t *p = (int16_t *)block->p_buffer;
 
-    for (size_t n = block->i_buffer / sizeof (*p); n > 0; n--)
+    if (mult < 0x10000)
     {
-        *p = (*p * mult) >> 16;
-        p++;
+        for (size_t n = block->i_buffer / sizeof (*p); n > 0; n--)
+        {
+            *p = (*p * mult) >> 16;
+            p++;
+        }
+    }
+    else
+    {
+        mult >>= 4;
+        for (size_t n = block->i_buffer / sizeof (*p); n > 0; n--)
+        {
+            int32_t v = (*p * mult) >> 12;
+            if (abs (v) > 0x7fff)
+                v = 0x8000;
+            *(p++) = v;
+        }
     }
 
     (void) mixer;