From 519b0809dfc89f635398eff5c0d064816d9b5d8a Mon Sep 17 00:00:00 2001 From: Christophe Massiot Date: Tue, 11 Feb 2003 11:16:04 +0000 Subject: [PATCH] * modules/codec/lpcm.c: Attempt at supporting all channel configurations, * Support for 7 and 7.1 channel configurations. --- include/audio_output.h | 6 ++-- .../audio_filter/channel_mixer/headphone.c | 4 ++- modules/codec/lpcm.c | 35 ++++++++++++------- src/audio_output/common.c | 12 +++++-- 4 files changed, 39 insertions(+), 18 deletions(-) diff --git a/include/audio_output.h b/include/audio_output.h index 95534c702d..88b3f787c5 100644 --- a/include/audio_output.h +++ b/include/audio_output.h @@ -2,7 +2,7 @@ * audio_output.h : audio output interface ***************************************************************************** * Copyright (C) 2002 VideoLAN - * $Id: audio_output.h,v 1.78 2003/02/09 01:13:43 massiot Exp $ + * $Id: audio_output.h,v 1.79 2003/02/11 11:16:04 massiot Exp $ * * Authors: Christophe Massiot * @@ -111,7 +111,9 @@ typedef int32_t vlc_fixed_t; #define AOUT_CHAN_REARCENTER 0x10 #define AOUT_CHAN_REARLEFT 0x20 #define AOUT_CHAN_REARRIGHT 0x40 -#define AOUT_CHAN_LFE 0x100 +#define AOUT_CHAN_MIDDLELEFT 0x100 +#define AOUT_CHAN_MIDDLERIGHT 0x200 +#define AOUT_CHAN_LFE 0x1000 /* Values available for original channels only */ #define AOUT_CHAN_DOLBYSTEREO 0x10000 diff --git a/modules/audio_filter/channel_mixer/headphone.c b/modules/audio_filter/channel_mixer/headphone.c index ee7c3a4072..5ae9dae983 100644 --- a/modules/audio_filter/channel_mixer/headphone.c +++ b/modules/audio_filter/channel_mixer/headphone.c @@ -3,7 +3,7 @@ * -> gives the feeling of a real room with a simple headphone ***************************************************************************** * Copyright (C) 2002 VideoLAN - * $Id: headphone.c,v 1.1 2002/12/09 00:52:42 babal Exp $ + * $Id: headphone.c,v 1.2 2003/02/11 11:16:04 massiot Exp $ * * Authors: Boris Dorès * @@ -260,6 +260,8 @@ static int Create( vlc_object_t *p_this ) aout_filter_t * p_filter = (aout_filter_t *)p_this; if ( p_filter->output.i_physical_channels != ( AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT ) + || (p_filter->input.i_physical_channels & AOUT_CHAN_MIDDLELEFT) + || (p_filter->input.i_physical_channels & AOUT_CHAN_MIDDLERIGHT) || p_filter->input.i_format != p_filter->output.i_format || p_filter->input.i_rate != p_filter->output.i_rate || (p_filter->input.i_format != VLC_FOURCC('f','l','3','2') diff --git a/modules/codec/lpcm.c b/modules/codec/lpcm.c index 747eb1d083..6017b37ce9 100644 --- a/modules/codec/lpcm.c +++ b/modules/codec/lpcm.c @@ -2,7 +2,7 @@ * lpcm.c: lpcm decoder module ***************************************************************************** * Copyright (C) 1999-2001 VideoLAN - * $Id: lpcm.c,v 1.10 2003/01/02 20:48:28 gbazin Exp $ + * $Id: lpcm.c,v 1.11 2003/02/11 11:16:04 massiot Exp $ * * Authors: Samuel Hocevar * Henri Fallon @@ -176,7 +176,7 @@ static void DecodeFrame( dec_thread_t * p_dec ) aout_buffer_t * p_buffer; mtime_t i_pts; uint8_t i_header; - unsigned int i_rate, i_original_channels, i_nb_channels; + unsigned int i_rate, i_original_channels; /* Look for sync word - should be 0xXX80 */ RealignBits( &p_dec->bit_stream ); @@ -214,32 +214,41 @@ static void DecodeFrame( dec_thread_t * p_dec ) { case 0: i_original_channels = AOUT_CHAN_CENTER; - i_nb_channels = 1; break; case 1: i_original_channels = AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT; - i_nb_channels = 2; + break; + case 2: + /* This is unsure. */ + i_original_channels = AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT | AOUT_CHAN_LFE; break; case 3: i_original_channels = AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT | AOUT_CHAN_REARLEFT | AOUT_CHAN_REARRIGHT; - i_nb_channels = 4; + break; + case 4: + /* This is unsure. */ + i_original_channels = AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT + | AOUT_CHAN_REARLEFT | AOUT_CHAN_REARRIGHT + | AOUT_CHAN_LFE; break; case 5: i_original_channels = AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT | AOUT_CHAN_REARLEFT | AOUT_CHAN_REARRIGHT | AOUT_CHAN_CENTER | AOUT_CHAN_LFE; - i_nb_channels = 6; break; - case 2: - case 4: case 6: + i_original_channels = AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT + | AOUT_CHAN_REARLEFT | AOUT_CHAN_REARRIGHT + | AOUT_CHAN_CENTER | AOUT_CHAN_MIDDLELEFT + | AOUT_CHAN_MIDDLERIGHT; + break; case 7: - default: - msg_Err( p_dec->p_fifo, "unsupported LPCM channels (0x%x)", - i_header ); - p_dec->p_fifo->b_error = 1; - return; + i_original_channels = AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT + | AOUT_CHAN_REARLEFT | AOUT_CHAN_REARRIGHT + | AOUT_CHAN_CENTER | AOUT_CHAN_MIDDLELEFT + | AOUT_CHAN_MIDDLERIGHT | AOUT_CHAN_LFE; + break; } if( (p_dec->p_aout_input != NULL) && diff --git a/src/audio_output/common.c b/src/audio_output/common.c index e02813bb8c..c86b8158d7 100644 --- a/src/audio_output/common.c +++ b/src/audio_output/common.c @@ -2,7 +2,7 @@ * common.c : audio output management of common data structures ***************************************************************************** * Copyright (C) 2002 VideoLAN - * $Id: common.c,v 1.16 2003/01/23 17:13:28 massiot Exp $ + * $Id: common.c,v 1.17 2003/02/11 11:16:04 massiot Exp $ * * Authors: Christophe Massiot * @@ -99,7 +99,7 @@ unsigned int aout_FormatNbChannels( const audio_sample_format_t * p_format ) static const uint32_t pi_channels[] = { AOUT_CHAN_CENTER, AOUT_CHAN_LEFT, AOUT_CHAN_RIGHT, AOUT_CHAN_REARCENTER, AOUT_CHAN_REARLEFT, AOUT_CHAN_REARRIGHT, - AOUT_CHAN_LFE }; + AOUT_CHAN_MIDDLELEFT, AOUT_CHAN_MIDDLERIGHT, AOUT_CHAN_LFE }; unsigned int i_nb = 0, i; for ( i = 0; i < sizeof(pi_channels)/sizeof(uint32_t); i++ ) @@ -235,6 +235,14 @@ const char * aout_FormatPrintChannels( const audio_sample_format_t * p_format ) case AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT | AOUT_CHAN_CENTER | AOUT_CHAN_REARLEFT | AOUT_CHAN_REARRIGHT | AOUT_CHAN_LFE: return "3F2R/LFE"; + case AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT | AOUT_CHAN_CENTER + | AOUT_CHAN_REARLEFT | AOUT_CHAN_REARRIGHT | AOUT_CHAN_MIDDLELEFT + | AOUT_CHAN_MIDDLERIGHT: + return "3F2M2R"; + case AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT | AOUT_CHAN_CENTER + | AOUT_CHAN_REARLEFT | AOUT_CHAN_REARRIGHT | AOUT_CHAN_MIDDLELEFT + | AOUT_CHAN_MIDDLERIGHT | AOUT_CHAN_LFE: + return "3F2M2R/LFE"; } return "ERROR"; -- 2.39.5