Mercurial > mplayer.hg
changeset 3410:3eb15016e454
still fiddling with surround levels
author | steve |
---|---|
date | Sun, 09 Dec 2001 18:54:54 +0000 |
parents | b26e0f8cf2d7 |
children | 1c571bccd19a |
files | libao2/pl_surround.c |
diffstat | 1 files changed, 11 insertions(+), 12 deletions(-) [+] |
line wrap: on
line diff
--- a/libao2/pl_surround.c Sun Dec 09 18:42:53 2001 +0000 +++ b/libao2/pl_surround.c Sun Dec 09 18:54:54 2001 +0000 @@ -156,19 +156,21 @@ out = pl_surround.databuf; in = (int16_t *)ao_plugin_data.data; for (i=0; i<samples; i++) { - // About the .707 here and the /2 for surround: + // About volume balancing... // Surround encoding does the following: // Lt=L+.707*C+.707*S, Rt=R+.707*C-.707*S - // So S needs to be extracted as: - // .707*(L-R) - // But L-R could still be as much as 32767-(-32768), way off scale - // for signed 16 bits, so to avoid running out of bits, whilst still - // keeping levels in balance, we scale L and R down by 3dB (*.707), - // and scale the surround down by 6dB (.707*.707=.5) + // So S should to be extracted as: + // .707*(Lt-Rt) + // But we are splitting the S to two output channels, so we + // must take another 3dB off as we split it: + // Ls=Rs=.707*.707*(Lt-Rt) + // = .5*(Lt-Rt) + // This result is handy as it is also sure not to clip, even + // though L could be full scale +ve, R full scale -ve // front left and right - out[0] = in[0]*.707; - out[1] = in[1]*.707; + out[0] = in[0]; + out[1] = in[1]; // surround - from 15msec ago out[2] = pl_surround.delaybuf[pl_surround.delaybuf_ptr]; out[3] = -out[2]; @@ -184,6 +186,3 @@ ao_plugin_data.len=samples*sizeof(int16_t)*4; return 1; } - - -