[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