Commit 84ae579e authored by Boris Dorès's avatar Boris Dorès

- new headphone channel mixer with virtual spatialization effect : This

  effect should give you the feeling that you stands in a real room with
  a complete 5.1 speaker set when using only a headphone, providing a
  more realistic sound experience. It should also be more comfortable
  and less tiring when listening to music for long periods of time.It
  works with any source format from mono to 5.1.

  -> please try it and feel free to give me some feedback. Some
     improvements are already planned (adding echo, more configuration
     options, ...).

NB: whereas the filter itself is in a (very first) stable version, the
    way it is integrated to the filter chain is only a _temporary_ hack
    since it's the audio ouput core (input.c actually) which is directly
    responsible for it. Integrating it in a more suitable way will
    probably require some work on the way the filters are selected as
    well as on the configuration level, but I'm working on it :)
parent 2397666a
......@@ -129,6 +129,7 @@ E: babal@via.ecp.fr
C: babal
D: Win32 network input
D: Win32 interface
D: Headphone channel mixer
S: France
N: Jean-Marc Dressler
......
0.5.0
Not released yet
* ./modules/audio_filter/channel_mixer/headphone.x: new headphone channel
mixer with virtual spatialization effect
* ./modules/gui/win32/preferences.*: redesigned preference dialog box
* ./modules/audio_filter/resampler/linear.c: new audio resampler based on
linear interpolation
* ./modules/gui/macosx/prefs.m: new configuration interface
......
......@@ -688,7 +688,7 @@ PLUGINS="${PLUGINS} lpcm a52"
PLUGINS="${PLUGINS} deinterlace invert adjust wall transform distort clone crop motionblur"
PLUGINS="${PLUGINS} float32tos16 float32tos8 float32tou16 float32tou8 a52tospdif fixed32tofloat32 fixed32tos16 s16tofloat32 s16tofloat32swab s8tofloat32 u8tofixed32 u8tofloat32"
PLUGINS="${PLUGINS} trivial_resampler ugly_resampler linear_resampler"
PLUGINS="${PLUGINS} trivial_channel_mixer"
PLUGINS="${PLUGINS} trivial_channel_mixer headphone_channel_mixer"
PLUGINS="${PLUGINS} trivial_mixer spdif_mixer float32_mixer"
PLUGINS="${PLUGINS} aout_file"
#PLUGINS="${PLUGINS} scope"
......
List of vlc plugins
$Id: LIST,v 1.5 2002/11/21 21:37:46 gbazin Exp $
$Id: LIST,v 1.6 2002/12/09 00:52:42 babal Exp $
* a52_system: input module for A52 decapsulation.
......@@ -66,6 +66,8 @@ $Id: LIST,v 1.5 2002/11/21 21:37:46 gbazin Exp $
* gtk: interface using the Gtk+ widget set.
* headphone: headphone channel mixer with virtual spatialization effect.
* idct: inverse DCT module, used by the video decoder.
* idctclassic: another version of idct.
......
SOURCES_trivial_channel_mixer = modules/audio_filter/channel_mixer/trivial.c
SOURCES_headphone_channel_mixer = modules/audio_filter/channel_mixer/headphone.c
This diff is collapsed.
......@@ -2,7 +2,7 @@
* input.c : internal management of input streams for the audio output
*****************************************************************************
* Copyright (C) 2002 VideoLAN
* $Id: input.c,v 1.26 2002/12/06 10:10:39 sam Exp $
* $Id: input.c,v 1.27 2002/12/09 00:52:42 babal Exp $
*
* Authors: Christophe Massiot <massiot@via.ecp.fr>
*
......@@ -41,7 +41,8 @@
*****************************************************************************/
int aout_InputNew( aout_instance_t * p_aout, aout_input_t * p_input )
{
audio_sample_format_t intermediate_format;
audio_sample_format_t intermediate_format, headphone_intermediate_format;
aout_filter_t * p_headphone_filter;
aout_FormatPrint( p_aout, "input", &p_input->input );
......@@ -52,10 +53,23 @@ int aout_InputNew( aout_instance_t * p_aout, aout_input_t * p_input )
/* Create filters. */
memcpy( &intermediate_format, &p_aout->mixer.mixer,
sizeof(audio_sample_format_t) );
memcpy( &headphone_intermediate_format, &p_aout->mixer.mixer,
sizeof(audio_sample_format_t) );
if ( config_GetInt( p_aout , "headphone" ) )
{
headphone_intermediate_format.i_physical_channels = p_input->input.i_physical_channels;
headphone_intermediate_format.i_original_channels = p_input->input.i_original_channels;
headphone_intermediate_format.i_bytes_per_frame =
headphone_intermediate_format.i_bytes_per_frame
* aout_FormatNbChannels( &headphone_intermediate_format )
/ aout_FormatNbChannels( &intermediate_format );
}
intermediate_format.i_rate = p_input->input.i_rate;
headphone_intermediate_format.i_rate = p_input->input.i_rate;
if ( aout_FiltersCreatePipeline( p_aout, p_input->pp_filters,
&p_input->i_nb_filters, &p_input->input,
&intermediate_format ) < 0 )
&headphone_intermediate_format ) < 0 )
{
msg_Err( p_aout, "couldn't set an input pipeline" );
......@@ -65,6 +79,43 @@ int aout_InputNew( aout_instance_t * p_aout, aout_input_t * p_input )
return -1;
}
if ( config_GetInt( p_aout , "headphone" ) )
{
/* create a vlc object */
p_headphone_filter = vlc_object_create( p_aout
, sizeof(aout_filter_t) );
if ( p_headphone_filter == NULL )
{
msg_Err( p_aout, "couldn't open the headphone virtual spatialization module" );
aout_FifoDestroy( p_aout, &p_input->fifo );
p_input->b_error = 1;
return -1;
}
vlc_object_attach( p_headphone_filter, p_aout );
/* find the headphone filter */
memcpy( &p_headphone_filter->input, &headphone_intermediate_format
, sizeof(audio_sample_format_t) );
memcpy( &p_headphone_filter->output, &intermediate_format
, sizeof(audio_sample_format_t) );
p_headphone_filter->p_module = module_Need( p_headphone_filter, "audio filter"
, "headphone" );
if ( p_headphone_filter->p_module == NULL )
{
vlc_object_detach( p_headphone_filter );
vlc_object_destroy( p_headphone_filter );
msg_Err( p_aout, "couldn't open the headphone virtual spatialization module" );
aout_FifoDestroy( p_aout, &p_input->fifo );
p_input->b_error = 1;
return -1;
}
/* success */
p_headphone_filter->b_reinit = VLC_TRUE;
p_input->pp_filters[p_input->i_nb_filters++] = p_headphone_filter;
}
/* Prepare hints for the buffer allocator. */
p_input->input_alloc.i_alloc_type = AOUT_ALLOC_HEAP;
p_input->input_alloc.i_bytes_per_sec = -1;
......
......@@ -2,7 +2,7 @@
* libvlc.h: main libvlc header
*****************************************************************************
* Copyright (C) 1998-2002 VideoLAN
* $Id: libvlc.h,v 1.27 2002/12/07 22:29:15 titer Exp $
* $Id: libvlc.h,v 1.28 2002/12/09 00:52:42 babal Exp $
*
* Authors: Vincent Seguin <seguin@via.ecp.fr>
* Samuel Hocevar <sam@zoy.org>
......@@ -108,6 +108,20 @@
"This option allows you to delay the audio output. This can be handy if " \
"you notice a lag between the video and the audio.")
#define HEADPHONE_TEXT N_("headphone virtual spatialization effect")
#define HEADPHONE_LONGTEXT N_( \
"This effect gives you the feeling that you stands in a real room " \
"with a complete 5.1 speaker set when using only a headphone, " \
"providing a more realistic sound experience. It should also be " \
"more comfortable and less tiring when listening to music for " \
"long periods of time.\nIt works with any source format from mono " \
"to 5.1.")
#define HEADPHONE_DIM_TEXT N_("characteristic dimension")
#define HEADPHONE_DIM_LONGTEXT N_( \
"Headphone virtual spatialization effect parameter: "\
"distance between front left speaker and listener in meters.")
#define VOUT_TEXT N_("video output module")
#define VOUT_LONGTEXT N_( \
"This option allows you to select the video output method used by vlc. " \
......@@ -400,6 +414,9 @@ vlc_module_begin();
AOUT_CHANNELS_TEXT, AOUT_CHANNELS_LONGTEXT );
add_integer( "desync", 0, NULL, DESYNC_TEXT, DESYNC_LONGTEXT );
add_integer( "audio-format", 0, NULL, FORMAT_TEXT, FORMAT_LONGTEXT );
add_bool( "headphone", 0, NULL, HEADPHONE_TEXT, HEADPHONE_LONGTEXT );
add_integer( "headphone-dim", 5, NULL, HEADPHONE_DIM_TEXT,
HEADPHONE_DIM_LONGTEXT );
/* Video options */
add_category_hint( N_("Video"), NULL );
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment