[vlc-devel] [PATCH] jack: create two outputs for mono input

Tristan Matthews le.businessman at gmail.com
Sun Nov 10 19:22:06 CET 2013


Fixes #8272.
---
 modules/audio_output/jack.c | 18 ++++++++++++------
 1 file changed, 12 insertions(+), 6 deletions(-)

diff --git a/modules/audio_output/jack.c b/modules/audio_output/jack.c
index 2e8c1f8..34149d6 100644
--- a/modules/audio_output/jack.c
+++ b/modules/audio_output/jack.c
@@ -55,6 +55,7 @@ struct aout_sys_t
     jack_client_t  *p_jack_client;
     jack_port_t   **p_jack_ports;
     jack_sample_t **p_jack_buffers;
+    unsigned int    i_ports;  /* Will be 2 for mono input */
     unsigned int    i_channels;
     unsigned int    i_rate;
     jack_nframes_t latency;
@@ -147,9 +148,10 @@ static int Start( audio_output_t *p_aout, audio_sample_format_t *restrict fmt )
     aout_SoftVolumeStart( p_aout );
 
     p_sys->i_channels = aout_FormatNbChannels( fmt );
+    p_sys->i_ports = __MAX(p_sys->i_channels, 2);
     aout_FormatPrepare(fmt);
 
-    p_sys->p_jack_ports = malloc( p_sys->i_channels *
+    p_sys->p_jack_ports = malloc( p_sys->i_ports *
                                   sizeof(jack_port_t *) );
     if( p_sys->p_jack_ports == NULL )
     {
@@ -157,7 +159,7 @@ static int Start( audio_output_t *p_aout, audio_sample_format_t *restrict fmt )
         goto error_out;
     }
 
-    p_sys->p_jack_buffers = malloc( p_sys->i_channels *
+    p_sys->p_jack_buffers = malloc( p_sys->i_ports *
                                     sizeof(jack_sample_t *) );
     if( p_sys->p_jack_buffers == NULL )
     {
@@ -181,7 +183,7 @@ static int Start( audio_output_t *p_aout, audio_sample_format_t *restrict fmt )
     }
 
     /* Create the output ports */
-    for( i = 0; i < p_sys->i_channels; i++ )
+    for( i = 0; i < p_sys->i_ports; i++ )
     {
         snprintf( psz_name, sizeof(psz_name), "out_%d", i + 1);
         psz_name[sizeof(psz_name) - 1] = '\0';
@@ -222,7 +224,7 @@ static int Start( audio_output_t *p_aout, audio_sample_format_t *restrict fmt )
         }
 
         /* Tie the output ports to JACK input ports */
-        for( i = 0; i_in_ports > 0 && i < p_sys->i_channels; i++ )
+        for( i = 0; i_in_ports > 0 && i < p_sys->i_ports; i++ )
         {
             const char* psz_in = pp_in_ports[i % i_in_ports];
             const char* psz_out = jack_port_name( p_sys->p_jack_ports[i] );
@@ -355,7 +357,7 @@ int Process( jack_nframes_t i_frames, void *p_arg )
         frames_from_rb = i_frames;
 
     /* Get the JACK buffers to write to */
-    for( i = 0; i < p_sys->i_channels; i++ )
+    for( i = 0; i < p_sys->i_ports; i++ )
     {
         p_sys->p_jack_buffers[i] = jack_port_get_buffer( p_sys->p_jack_ports[i],
                                                          i_frames );
@@ -372,11 +374,15 @@ int Process( jack_nframes_t i_frames, void *p_arg )
         }
     }
 
+    /* Dupicate mono input to stereo output */
+    if (p_sys->i_ports != p_sys->i_channels)
+        memcpy(p_sys->p_jack_buffers[1], p_sys->p_jack_buffers[0], bytes_read);
+
     /* Fill any remaining buffer with silence */
     frames_read = (bytes_read / sizeof(jack_sample_t)) / p_sys->i_channels;
     if( frames_read < i_frames )
     {
-        for( i = 0; i < p_sys->i_channels; i++ )
+        for( i = 0; i < p_sys->i_ports; i++ )
         {
             memset( p_sys->p_jack_buffers[i] + frames_read, 0,
                     sizeof( jack_sample_t ) * (i_frames - frames_read) );
-- 
1.8.1.2




More information about the vlc-devel mailing list