vlc | branch: master | Rémi Denis-Courmont <[email protected]> | Tue Nov 13 20:23:07 2012 +0200| [5b595ec89fe2cb966aa5cbab64af77562ee54cdd] | committer: Rémi Denis-Courmont
aout: remove output conversions The filters chain will convert to whatever output format is needed, so this was redundant. > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=5b595ec89fe2cb966aa5cbab64af77562ee54cdd --- src/audio_output/aout_internal.h | 5 +- src/audio_output/dec.c | 12 +++-- src/audio_output/output.c | 93 +++++++++++--------------------------- 3 files changed, 35 insertions(+), 75 deletions(-) diff --git a/src/audio_output/aout_internal.h b/src/audio_output/aout_internal.h index 7affe5a..f3fac12 100644 --- a/src/audio_output/aout_internal.h +++ b/src/audio_output/aout_internal.h @@ -70,8 +70,6 @@ typedef struct unsigned nb_filters; filter_t *filters[AOUT_MAX_FILTERS]; /**< Configured user filters (e.g. equalization) and their conversions */ - unsigned nb_converters; - filter_t *converters[5]; /**< Converters to the output */ aout_request_vout_t request_vout; bool recycle_vout; @@ -123,8 +121,7 @@ audio_output_t *aout_New (vlc_object_t *); #define aout_New(a) aout_New(VLC_OBJECT(a)) void aout_Destroy (audio_output_t *); -int aout_OutputNew( audio_output_t * p_aout, - const audio_sample_format_t * p_format ); +int aout_OutputNew(audio_output_t *, audio_sample_format_t *); int aout_OutputTimeGet(audio_output_t *, mtime_t *); void aout_OutputPlay(audio_output_t *, block_t *); void aout_OutputPause( audio_output_t * p_aout, bool, mtime_t ); diff --git a/src/audio_output/dec.c b/src/audio_output/dec.c index 5e62bc8..0832194 100644 --- a/src/audio_output/dec.c +++ b/src/audio_output/dec.c @@ -75,10 +75,13 @@ int aout_DecNew( audio_output_t *p_aout, var_Destroy( p_aout, "stereo-mode" ); /* Create the audio output stream */ - owner->input_format = *p_format; - vlc_atomic_set (&owner->restart, 0); owner->volume = aout_volume_New (p_aout, p_replay_gain); - if( aout_OutputNew( p_aout, p_format ) < 0 ) + + vlc_atomic_set (&owner->restart, 0); + owner->input_format = *p_format; + owner->mixer_format = owner->input_format; + + if (aout_OutputNew (p_aout, &owner->mixer_format)) goto error; aout_volume_SetFormat (owner->volume, owner->mixer_format.i_format); @@ -142,7 +145,8 @@ static int aout_CheckRestart (audio_output_t *aout) if (restart & AOUT_RESTART_OUTPUT) { aout_OutputDelete (aout); - if (aout_OutputNew (aout, &owner->input_format)) + owner->mixer_format = owner->input_format; + if (aout_OutputNew (aout, &owner->mixer_format)) abort (); /* FIXME we are officially screwed */ aout_volume_SetFormat (owner->volume, owner->mixer_format.i_format); } diff --git a/src/audio_output/output.c b/src/audio_output/output.c index cf71752..91e9b78 100644 --- a/src/audio_output/output.c +++ b/src/audio_output/output.c @@ -28,7 +28,6 @@ #include <vlc_common.h> #include <vlc_aout.h> #include <vlc_modules.h> -#include <vlc_cpu.h> #include "libvlc.h" #include "aout_internal.h" @@ -300,19 +299,24 @@ int aout_MuteSet (audio_output_t *aout, bool mute) /** * Starts an audio output stream. - * \param fmtp audio output stream format [IN/OUT] + * \param fmt audio output stream format [IN/OUT] * \warning The caller must hold the audio output lock. */ -int aout_OutputNew (audio_output_t *aout, const audio_sample_format_t *fmtp) +int aout_OutputNew (audio_output_t *aout, audio_sample_format_t *restrict fmt) { - aout_owner_t *owner = aout_owner (aout); - - audio_sample_format_t fmt = *fmtp; - aout_FormatPrepare (&fmt); - aout_assert_locked (aout); - if (aout->start (aout, &fmt)) + /* Ideally, the audio filters would be created before the audio output, + * and the ideal audio format would be the output of the filters chain. + * But that scheme would not really play well with digital pass-through. */ + if (AOUT_FMT_LINEAR(fmt)) + { /* Try to stay in integer domain if possible for no/slow FPU. */ + fmt->i_format = (fmt->i_bitspersample > 16) ? VLC_CODEC_FL32 + : VLC_CODEC_S16N; + aout_FormatPrepare (fmt); + } + + if (aout->start (aout, fmt)) { msg_Err (aout, "module not functional"); return -1; @@ -327,24 +331,24 @@ int aout_OutputNew (audio_output_t *aout, const audio_sample_format_t *fmtp) switch (var_GetInteger (aout, "stereo-mode")) { case AOUT_VAR_CHAN_RSTEREO: - fmt.i_original_channels |= AOUT_CHAN_REVERSESTEREO; - break; + fmt->i_original_channels |= AOUT_CHAN_REVERSESTEREO; + break; case AOUT_VAR_CHAN_STEREO: - fmt.i_original_channels = AOUT_CHANS_STEREO; + fmt->i_original_channels = AOUT_CHANS_STEREO; break; case AOUT_VAR_CHAN_LEFT: - fmt.i_original_channels = AOUT_CHAN_LEFT; + fmt->i_original_channels = AOUT_CHAN_LEFT; break; case AOUT_VAR_CHAN_RIGHT: - fmt.i_original_channels = AOUT_CHAN_RIGHT; + fmt->i_original_channels = AOUT_CHAN_RIGHT; break; case AOUT_VAR_CHAN_DOLBYS: - fmt.i_original_channels = AOUT_CHANS_STEREO|AOUT_CHAN_DOLBYSTEREO; + fmt->i_original_channels = AOUT_CHANS_STEREO|AOUT_CHAN_DOLBYSTEREO; break; default: { - if ((fmt.i_original_channels & AOUT_CHAN_PHYSMASK) - != AOUT_CHANS_STEREO) + if ((fmt->i_original_channels & AOUT_CHAN_PHYSMASK) + != AOUT_CHANS_STEREO) break; vlc_value_t val, txt; @@ -352,7 +356,7 @@ int aout_OutputNew (audio_output_t *aout, const audio_sample_format_t *fmtp) var_Change (aout, "stereo-mode", VLC_VAR_DELCHOICE, &val, NULL); txt.psz_string = _("Stereo audio mode"); var_Change (aout, "stereo-mode", VLC_VAR_SETTEXT, &txt, NULL); - if (fmt.i_original_channels & AOUT_CHAN_DOLBYSTEREO) + if (fmt->i_original_channels & AOUT_CHAN_DOLBYSTEREO) { val.i_int = AOUT_VAR_CHAN_DOLBYS; txt.psz_string = _("Dolby Surround"); @@ -367,9 +371,9 @@ int aout_OutputNew (audio_output_t *aout, const audio_sample_format_t *fmtp) val.i_int = AOUT_VAR_CHAN_LEFT; txt.psz_string = _("Left"); var_Change (aout, "stereo-mode", VLC_VAR_ADDCHOICE, &val, &txt); - if (fmt.i_original_channels & AOUT_CHAN_DUALMONO) + if (fmt->i_original_channels & AOUT_CHAN_DUALMONO) { /* Go directly to the left channel. */ - fmt.i_original_channels = AOUT_CHAN_LEFT; + fmt->i_original_channels = AOUT_CHAN_LEFT; var_Change (aout, "stereo-mode", VLC_VAR_SETVALUE, &val, NULL); } val.i_int = AOUT_VAR_CHAN_RIGHT; @@ -381,37 +385,8 @@ int aout_OutputNew (audio_output_t *aout, const audio_sample_format_t *fmtp) } } - aout_FormatPrepare (&fmt); - aout_FormatPrint (aout, "output", &fmt ); - - /* Choose the mixer format. */ - owner->mixer_format = fmt; - if (!AOUT_FMT_LINEAR(&fmt)) - owner->mixer_format.i_format = fmtp->i_format; - else - /* Most audio filters can only deal with single-precision, - * so lets always use that when hardware supports floating point. */ - if( HAVE_FPU ) - owner->mixer_format.i_format = VLC_CODEC_FL32; - else - /* Fallback to 16-bits. This avoids pointless conversion to and from - * 32-bits samples for the sole purpose of software mixing. */ - owner->mixer_format.i_format = VLC_CODEC_S16N; - - aout_FormatPrepare (&owner->mixer_format); - aout_FormatPrint (aout, "mixer", &owner->mixer_format); - - /* Create converters. */ - owner->nb_converters = 0; - if (aout_FiltersPipelineCreate (aout, owner->converters, - &owner->nb_converters, - sizeof (owner->converters) / sizeof (owner->converters[0]), - &owner->mixer_format, &fmt) < 0) - { - msg_Err (aout, "couldn't create audio output pipeline"); - aout_OutputDelete (aout); - return -1; - } + aout_FormatPrepare (fmt); + aout_FormatPrint (aout, "output", fmt); return 0; } @@ -422,14 +397,11 @@ int aout_OutputNew (audio_output_t *aout, const audio_sample_format_t *fmtp) */ void aout_OutputDelete (audio_output_t *aout) { - aout_owner_t *owner = aout_owner (aout); - aout_assert_locked (aout); var_DelCallback (aout, "stereo-mode", aout_ChannelsRestart, NULL); if (aout->stop != NULL) aout->stop (aout); - aout_FiltersPipelineDestroy (owner->converters, owner->nb_converters); } int aout_OutputTimeGet (audio_output_t *aout, mtime_t *pts) @@ -448,20 +420,7 @@ int aout_OutputTimeGet (audio_output_t *aout, mtime_t *pts) */ void aout_OutputPlay (audio_output_t *aout, block_t *block) { - aout_owner_t *owner = aout_owner (aout); - aout_assert_locked (aout); - - block = aout_FiltersPipelinePlay (owner->converters, owner->nb_converters, - block); - if (block == NULL) - return; - if (block->i_buffer == 0) - { - block_Release (block); - return; - } - aout->play (aout, block); } _______________________________________________ vlc-commits mailing list [email protected] http://mailman.videolan.org/listinfo/vlc-commits
