vlc | branch: master | Pierre Lamot <[email protected]> | Tue May 22 16:53:09 
2018 +0200| [187c33de2b5da1c26167769613347fe7bde992dc] | committer: 
Jean-Baptiste Kempf

spatialaudio: mix non-diegetic streams on left/right speakers

Signed-off-by: Jean-Baptiste Kempf <[email protected]>

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=187c33de2b5da1c26167769613347fe7bde992dc
---

 modules/audio_filter/channel_mixer/spatialaudio.cpp | 19 +++++++++++++++++++
 1 file changed, 19 insertions(+)

diff --git a/modules/audio_filter/channel_mixer/spatialaudio.cpp 
b/modules/audio_filter/channel_mixer/spatialaudio.cpp
index 58741f531e..2e350a5f04 100644
--- a/modules/audio_filter/channel_mixer/spatialaudio.cpp
+++ b/modules/audio_filter/channel_mixer/spatialaudio.cpp
@@ -126,6 +126,7 @@ struct filter_spatialaudio
     mtime_t i_last_input_pts;
     unsigned i_order;
     unsigned i_nondiegetic;
+    unsigned i_lr_channels; // number of physical left/right channel pairs
 
     float** inBuf;
     float** outBuf;
@@ -249,6 +250,20 @@ static block_t *Mix( filter_t *p_filter, block_t *p_buf )
         for (unsigned i = 0; i < p_sys->i_outputNb; ++i)
             for (unsigned j = 0; j < AMB_BLOCK_TIME_LEN; ++j)
                 p_dest[(b * AMB_BLOCK_TIME_LEN + j) * p_sys->i_outputNb + i] = 
p_sys->outBuf[i][j];
+
+        if (p_sys->i_nondiegetic == 2)
+        {
+            for (unsigned i = 0; i < p_sys->i_lr_channels * 2; i += 2)
+                for (unsigned j = 0; j < AMB_BLOCK_TIME_LEN; ++j)
+                {
+                    p_dest[(b * AMB_BLOCK_TIME_LEN + j) * p_sys->i_outputNb + 
i] =
+                            p_dest[(b * AMB_BLOCK_TIME_LEN + j) * 
p_sys->i_outputNb + i]  / 2.f
+                            + p_sys->inBuf[p_sys->i_inputNb - 2][j] / 2.f; 
//left
+                    p_dest[(b * AMB_BLOCK_TIME_LEN + j) * p_sys->i_outputNb + 
i + 1] =
+                            p_dest[(b * AMB_BLOCK_TIME_LEN + j) * 
p_sys->i_outputNb + i + 1]  / 2.f
+                            + p_sys->inBuf[p_sys->i_inputNb - 1][j] / 2.f; 
//right
+                }
+        }
     }
 
     p_sys->inputSamples.erase(p_sys->inputSamples.begin(),
@@ -325,6 +340,7 @@ static int OpenBinauralizer(vlc_object_t *p_this)
     p_sys->mode = filter_spatialaudio::BINAURALIZER;
     p_sys->i_inputNb = p_filter->fmt_in.audio.i_channels;
     p_sys->i_outputNb = 2;
+    p_sys->i_lr_channels = 1;
 
     if (allocateBuffers(p_sys) != VLC_SUCCESS)
     {
@@ -491,17 +507,20 @@ static int Open(vlc_object_t *p_this)
 
         p_sys->speakerDecoder.SetPosition(s++, {DegreesToRadians(30), 0.f, 
1.f});
         p_sys->speakerDecoder.SetPosition(s++, {DegreesToRadians(-30), 0.f, 
1.f});
+        p_sys->i_lr_channels = 1;
 
         if ((outfmt->i_physical_channels & AOUT_CHANS_MIDDLE) == 
AOUT_CHANS_MIDDLE)
         {
             p_sys->speakerDecoder.SetPosition(s++, {DegreesToRadians(110), 
0.f, 1.f});
             p_sys->speakerDecoder.SetPosition(s++, {DegreesToRadians(-110), 
0.f, 1.f});
+            p_sys->i_lr_channels++;
         }
 
         if ((outfmt->i_physical_channels & AOUT_CHANS_REAR) == AOUT_CHANS_REAR)
         {
             p_sys->speakerDecoder.SetPosition(s++, {DegreesToRadians(145), 
0.f, 1.f});
             p_sys->speakerDecoder.SetPosition(s++, {DegreesToRadians(-145), 
0.f, 1.f});
+            p_sys->i_lr_channels++;
         }
 
         if ((outfmt->i_physical_channels & AOUT_CHAN_CENTER) == 
AOUT_CHAN_CENTER)

_______________________________________________
vlc-commits mailing list
[email protected]
https://mailman.videolan.org/listinfo/vlc-commits

Reply via email to