[vlc-commits] wasapi: reorder channels (fixes #6829)

Rémi Denis-Courmont git at videolan.org
Sun Nov 11 12:17:47 CET 2012


vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Sun Nov 11 13:05:19 2012 +0200| [dfdc2d1be4e48abaf5541ba2fefcd65c03059442] | committer: Rémi Denis-Courmont

wasapi: reorder channels (fixes #6829)

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

 modules/audio_output/wasapi.c |   68 ++++++++++++++++++++++++++---------------
 1 file changed, 44 insertions(+), 24 deletions(-)

diff --git a/modules/audio_output/wasapi.c b/modules/audio_output/wasapi.c
index eabf497..cb54d9e 100644
--- a/modules/audio_output/wasapi.c
+++ b/modules/audio_output/wasapi.c
@@ -122,9 +122,13 @@ struct aout_sys_t
     struct IAudioSessionEvents events;
     LONG refs;
 
+    uint8_t chans_table[AOUT_CHAN_MAX];
+    uint8_t chans_to_reorder;
+    uint8_t bits; /**< Bits per sample */
     unsigned rate; /**< Sample rate */
     unsigned bytes_per_frame;
     UINT32 frames; /**< Total buffer size (frames) */
+
     HANDLE ready; /**< Semaphore from MTA thread */
     HANDLE done; /**< Semaphore to MTA thread */
 };
@@ -136,6 +140,10 @@ static void Play(audio_output_t *aout, block_t *block, mtime_t *restrict drift)
     aout_sys_t *sys = aout->sys;
     HRESULT hr = S_OK;
 
+    if (sys->chans_to_reorder)
+        aout_ChannelReorder(block->p_buffer, block->i_buffer,
+                          sys->chans_to_reorder, sys->chans_table, sys->bits);
+
     Enter();
     if (likely(sys->clock != NULL))
     {
@@ -518,6 +526,19 @@ static const struct IAudioSessionEventsVtbl vlc_AudioSessionEvents =
 
 
 /*** Initialization / deinitialization **/
+static const uint32_t chans_out[] = {
+    SPEAKER_FRONT_LEFT, SPEAKER_FRONT_RIGHT,
+    SPEAKER_FRONT_CENTER, SPEAKER_LOW_FREQUENCY,
+    SPEAKER_BACK_LEFT, SPEAKER_BACK_RIGHT, SPEAKER_BACK_CENTER,
+    SPEAKER_SIDE_LEFT, SPEAKER_SIDE_RIGHT, 0
+};
+static const uint32_t chans_in[] = {
+    SPEAKER_FRONT_LEFT, SPEAKER_FRONT_RIGHT,
+    SPEAKER_SIDE_LEFT, SPEAKER_SIDE_RIGHT,
+    SPEAKER_BACK_LEFT, SPEAKER_BACK_RIGHT, SPEAKER_BACK_CENTER,
+    SPEAKER_FRONT_CENTER, SPEAKER_LOW_FREQUENCY, 0
+};
+
 static void vlc_ToWave(WAVEFORMATEXTENSIBLE *restrict wf,
                        audio_sample_format_t *restrict audio)
 {
@@ -554,38 +575,31 @@ static void vlc_ToWave(WAVEFORMATEXTENSIBLE *restrict wf,
     wf->Samples.wValidBitsPerSample = audio->i_bitspersample;
 
     wf->dwChannelMask = 0;
-    if (audio->i_physical_channels & AOUT_CHAN_LEFT)
-        wf->dwChannelMask |= SPEAKER_FRONT_LEFT;
-    if (audio->i_physical_channels & AOUT_CHAN_RIGHT)
-        wf->dwChannelMask |= SPEAKER_FRONT_RIGHT;
-    if (audio->i_physical_channels & AOUT_CHAN_CENTER)
-        wf->dwChannelMask |= SPEAKER_FRONT_CENTER;
-    if (audio->i_physical_channels & AOUT_CHAN_LFE)
-        wf->dwChannelMask |= SPEAKER_LOW_FREQUENCY;
-    if (audio->i_physical_channels & AOUT_CHAN_REARLEFT)
-        wf->dwChannelMask |= SPEAKER_BACK_LEFT;
-    if (audio->i_physical_channels & AOUT_CHAN_REARRIGHT)
-        wf->dwChannelMask |= SPEAKER_BACK_RIGHT;
-    /* ... */
-    if (audio->i_physical_channels & AOUT_CHAN_REARCENTER)
-        wf->dwChannelMask |= SPEAKER_BACK_CENTER;
-    if (audio->i_physical_channels & AOUT_CHAN_MIDDLELEFT)
-        wf->dwChannelMask |= SPEAKER_SIDE_LEFT;
-    if (audio->i_physical_channels & AOUT_CHAN_MIDDLERIGHT)
-        wf->dwChannelMask |= SPEAKER_SIDE_RIGHT;
-    /* ... */
+    for (unsigned i = 0; pi_vlc_chan_order_wg4[i]; i++)
+        if (audio->i_physical_channels & pi_vlc_chan_order_wg4[i])
+            wf->dwChannelMask |= chans_in[i];
 }
 
 static int vlc_FromWave(const WAVEFORMATEX *restrict wf,
                         audio_sample_format_t *restrict audio)
 {
-    /* FIXME? different sample format? possible? */
     audio->i_rate = wf->nSamplesPerSec;
-    /* FIXME */
+
+    if (wf->wFormatTag == WAVE_FORMAT_EXTENSIBLE)
+    {
+        const WAVEFORMATEXTENSIBLE *wfe = (void *)wf;
+
+        audio->i_physical_channels = 0;
+        for (unsigned i = 0; chans_in[i]; i++)
+            if (wfe->dwChannelMask & chans_in[i])
+                audio->i_physical_channels |= pi_vlc_chan_order_wg4[i];
+    }
+
+    audio->i_original_channels = audio->i_physical_channels;
+    aout_FormatPrepare (audio);
+
     if (wf->nChannels != audio->i_channels)
         return -1;
-
-    aout_FormatPrepare(audio);
     return 0;
 }
 
@@ -745,6 +759,12 @@ retry:
     }
     else
         assert(pwf == NULL);
+
+    sys->chans_to_reorder = aout_CheckChannelReorder(chans_in, chans_out,
+                                                     fmt->i_physical_channels,
+                                                     sys->chans_table);
+    sys->bits = fmt->i_bitspersample;
+
     hr = IAudioClient_Initialize(sys->client, AUDCLNT_SHAREMODE_SHARED, 0,
                                  AOUT_MAX_PREPARE_TIME * 10, 0,
                                  (hr == S_OK) ? &wf.Format : pwf,



More information about the vlc-commits mailing list