* audio_output.h : audio output interface
*****************************************************************************
* Copyright (C) 2002 VideoLAN
- * $Id: audio_output.h,v 1.74 2002/12/07 23:50:30 massiot Exp $
+ * $Id: audio_output.h,v 1.75 2003/01/22 18:31:46 massiot Exp $
*
* Authors: Christophe Massiot <massiot@via.ecp.fr>
*
/* Values available for original channels only */
#define AOUT_CHAN_DOLBYSTEREO 0x10000
#define AOUT_CHAN_DUALMONO 0x20000
+#define AOUT_CHAN_REVERSESTEREO 0x40000
#define AOUT_CHAN_PHYSMASK 0xFFFF
* trivial.c : trivial channel mixer plug-in (drops unwanted channels)
*****************************************************************************
* Copyright (C) 2002 VideoLAN
- * $Id: trivial.c,v 1.9 2003/01/14 14:51:02 massiot Exp $
+ * $Id: trivial.c,v 1.10 2003/01/22 18:31:47 massiot Exp $
*
* Authors: Christophe Massiot <massiot@via.ecp.fr>
*
p_src += 2;
}
}
+ else if ( p_filter->output.i_original_channels
+ & AOUT_CHAN_REVERSESTEREO )
+ {
+ /* Reverse-stereo mode */
+ for ( i = p_in_buf->i_nb_samples; i -= 2; )
+ {
+ *p_dest++ = p_src[1];
+ *p_dest++ = p_src[0];
+ p_src += 2;
+ }
+ }
else
{
/* Fake-stereo mode */
* (http://liba52.sf.net/).
*****************************************************************************
* Copyright (C) 2001, 2002 VideoLAN
- * $Id: a52tofloat32.c,v 1.11 2003/01/22 09:54:28 massiot Exp $
+ * $Id: a52tofloat32.c,v 1.12 2003/01/22 18:31:47 massiot Exp $
*
* Authors: Gildas Bazin <gbazin@netcourrier.com>
* Christophe Massiot <massiot@via.ecp.fr>
}
}
+/*****************************************************************************
+ * Exchange: helper function to exchange left & right channels
+ *****************************************************************************/
+static void Exchange( float * p_out, const float * p_in )
+{
+ int i;
+ const float * p_first = p_in + 256;
+ const float * p_second = p_in;
+
+ for ( i = 0; i < 256; i++ )
+ {
+ *p_out++ = *p_first++;
+ *p_out++ = *p_second++;
+ }
+}
+
/*****************************************************************************
* DoWork: decode an ATSC A/52 frame.
*****************************************************************************/
Duplicate( (float *)(p_out_buf->p_buffer + i * i_bytes_per_block),
p_samples );
}
+ else if ( p_filter->output.i_original_channels
+ & AOUT_CHAN_REVERSESTEREO )
+ {
+ Exchange( (float *)(p_out_buf->p_buffer + i * i_bytes_per_block),
+ p_samples );
+ }
else
{
/* Interleave the *$£%ù samples. */
* common.c : audio output management of common data structures
*****************************************************************************
* Copyright (C) 2002 VideoLAN
- * $Id: common.c,v 1.14 2003/01/20 10:59:29 massiot Exp $
+ * $Id: common.c,v 1.15 2003/01/22 18:31:47 massiot Exp $
*
* Authors: Christophe Massiot <massiot@via.ecp.fr>
*
return "Left";
return "Right";
case AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT:
- if ( p_format->i_original_channels & AOUT_CHAN_DOLBYSTEREO )
- return "Dolby";
- else if ( p_format->i_original_channels & AOUT_CHAN_DUALMONO )
- return "Dual-mono";
- else if ( p_format->i_original_channels == AOUT_CHAN_CENTER )
- return "Stereo/Mono";
- else if ( !(p_format->i_original_channels & AOUT_CHAN_RIGHT) )
- return "Stereo/Left";
- else if ( !(p_format->i_original_channels & AOUT_CHAN_LEFT) )
- return "Stereo/Right";
- return "Stereo";
+ if ( p_format->i_original_channels & AOUT_CHAN_REVERSESTEREO )
+ {
+ if ( p_format->i_original_channels & AOUT_CHAN_DOLBYSTEREO )
+ return "Dolby/Reverse";
+ return "Stereo/Reverse";
+ }
+ else
+ {
+ if ( p_format->i_original_channels & AOUT_CHAN_DOLBYSTEREO )
+ return "Dolby";
+ else if ( p_format->i_original_channels & AOUT_CHAN_DUALMONO )
+ return "Dual-mono";
+ else if ( p_format->i_original_channels == AOUT_CHAN_CENTER )
+ return "Stereo/Mono";
+ else if ( !(p_format->i_original_channels & AOUT_CHAN_RIGHT) )
+ return "Stereo/Left";
+ else if ( !(p_format->i_original_channels & AOUT_CHAN_LEFT) )
+ return "Stereo/Right";
+ return "Stereo";
+ }
case AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT | AOUT_CHAN_CENTER:
return "3F";
case AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT | AOUT_CHAN_REARCENTER:
* output.c : internal management of output streams for the audio output
*****************************************************************************
* Copyright (C) 2002 VideoLAN
- * $Id: output.c,v 1.30 2003/01/22 09:54:29 massiot Exp $
+ * $Id: output.c,v 1.31 2003/01/22 18:31:47 massiot Exp $
*
* Authors: Christophe Massiot <massiot@via.ecp.fr>
*
/* The user may have selected a different channels configuration. */
var_Get( p_aout, "audio-channels", &val );
- if ( !strcmp( val.psz_string, N_("Both") ) )
+ if ( !strcmp( val.psz_string, N_("Reverse stereo") ) )
+ {
+ p_aout->output.output.i_original_channels |=
+ AOUT_CHAN_REVERSESTEREO;
+ }
+ else if ( !strcmp( val.psz_string, N_("Both") ) )
{
p_aout->output.output.i_original_channels =
AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT;
NULL );
}
else if ( p_aout->output.output.i_physical_channels ==
- (AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT)
- && (p_aout->output.output.i_original_channels
- & AOUT_CHAN_PHYSMASK) == (AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT) )
+ (AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT) )
{
/* Stereo - create the audio-channels variable. */
var_Create( p_aout, "audio-channels", VLC_VAR_STRING | VLC_VAR_HASCHOICE );
var_Change( p_aout, "audio-channels", VLC_VAR_ADDCHOICE, &val );
val.psz_string = N_("Right");
var_Change( p_aout, "audio-channels", VLC_VAR_ADDCHOICE, &val );
+ val.psz_string = N_("Reverse stereo");
+ var_Change( p_aout, "audio-channels", VLC_VAR_ADDCHOICE, &val );
var_AddCallback( p_aout, "audio-channels", aout_ChannelsRestart,
NULL );
}