Commit 5b595ec8 authored by Rémi Denis-Courmont's avatar Rémi Denis-Courmont

aout: remove output conversions

The filters chain will convert to whatever output format is needed, so
this was redundant.
parent 54fb7164
...@@ -70,8 +70,6 @@ typedef struct ...@@ -70,8 +70,6 @@ typedef struct
unsigned nb_filters; unsigned nb_filters;
filter_t *filters[AOUT_MAX_FILTERS]; /**< Configured user filters filter_t *filters[AOUT_MAX_FILTERS]; /**< Configured user filters
(e.g. equalization) and their conversions */ (e.g. equalization) and their conversions */
unsigned nb_converters;
filter_t *converters[5]; /**< Converters to the output */
aout_request_vout_t request_vout; aout_request_vout_t request_vout;
bool recycle_vout; bool recycle_vout;
...@@ -123,8 +121,7 @@ audio_output_t *aout_New (vlc_object_t *); ...@@ -123,8 +121,7 @@ audio_output_t *aout_New (vlc_object_t *);
#define aout_New(a) aout_New(VLC_OBJECT(a)) #define aout_New(a) aout_New(VLC_OBJECT(a))
void aout_Destroy (audio_output_t *); void aout_Destroy (audio_output_t *);
int aout_OutputNew( audio_output_t * p_aout, int aout_OutputNew(audio_output_t *, audio_sample_format_t *);
const audio_sample_format_t * p_format );
int aout_OutputTimeGet(audio_output_t *, mtime_t *); int aout_OutputTimeGet(audio_output_t *, mtime_t *);
void aout_OutputPlay(audio_output_t *, block_t *); void aout_OutputPlay(audio_output_t *, block_t *);
void aout_OutputPause( audio_output_t * p_aout, bool, mtime_t ); void aout_OutputPause( audio_output_t * p_aout, bool, mtime_t );
......
...@@ -75,10 +75,13 @@ int aout_DecNew( audio_output_t *p_aout, ...@@ -75,10 +75,13 @@ int aout_DecNew( audio_output_t *p_aout,
var_Destroy( p_aout, "stereo-mode" ); var_Destroy( p_aout, "stereo-mode" );
/* Create the audio output stream */ /* 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); 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; goto error;
aout_volume_SetFormat (owner->volume, owner->mixer_format.i_format); aout_volume_SetFormat (owner->volume, owner->mixer_format.i_format);
...@@ -142,7 +145,8 @@ static int aout_CheckRestart (audio_output_t *aout) ...@@ -142,7 +145,8 @@ static int aout_CheckRestart (audio_output_t *aout)
if (restart & AOUT_RESTART_OUTPUT) if (restart & AOUT_RESTART_OUTPUT)
{ {
aout_OutputDelete (aout); 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 */ abort (); /* FIXME we are officially screwed */
aout_volume_SetFormat (owner->volume, owner->mixer_format.i_format); aout_volume_SetFormat (owner->volume, owner->mixer_format.i_format);
} }
......
...@@ -28,7 +28,6 @@ ...@@ -28,7 +28,6 @@
#include <vlc_common.h> #include <vlc_common.h>
#include <vlc_aout.h> #include <vlc_aout.h>
#include <vlc_modules.h> #include <vlc_modules.h>
#include <vlc_cpu.h>
#include "libvlc.h" #include "libvlc.h"
#include "aout_internal.h" #include "aout_internal.h"
...@@ -300,19 +299,24 @@ int aout_MuteSet (audio_output_t *aout, bool mute) ...@@ -300,19 +299,24 @@ int aout_MuteSet (audio_output_t *aout, bool mute)
/** /**
* Starts an audio output stream. * 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. * \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); 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"); msg_Err (aout, "module not functional");
return -1; return -1;
...@@ -327,23 +331,23 @@ int aout_OutputNew (audio_output_t *aout, const audio_sample_format_t *fmtp) ...@@ -327,23 +331,23 @@ int aout_OutputNew (audio_output_t *aout, const audio_sample_format_t *fmtp)
switch (var_GetInteger (aout, "stereo-mode")) switch (var_GetInteger (aout, "stereo-mode"))
{ {
case AOUT_VAR_CHAN_RSTEREO: case AOUT_VAR_CHAN_RSTEREO:
fmt.i_original_channels |= AOUT_CHAN_REVERSESTEREO; fmt->i_original_channels |= AOUT_CHAN_REVERSESTEREO;
break; break;
case AOUT_VAR_CHAN_STEREO: case AOUT_VAR_CHAN_STEREO:
fmt.i_original_channels = AOUT_CHANS_STEREO; fmt->i_original_channels = AOUT_CHANS_STEREO;
break; break;
case AOUT_VAR_CHAN_LEFT: case AOUT_VAR_CHAN_LEFT:
fmt.i_original_channels = AOUT_CHAN_LEFT; fmt->i_original_channels = AOUT_CHAN_LEFT;
break; break;
case AOUT_VAR_CHAN_RIGHT: case AOUT_VAR_CHAN_RIGHT:
fmt.i_original_channels = AOUT_CHAN_RIGHT; fmt->i_original_channels = AOUT_CHAN_RIGHT;
break; break;
case AOUT_VAR_CHAN_DOLBYS: 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; break;
default: default:
{ {
if ((fmt.i_original_channels & AOUT_CHAN_PHYSMASK) if ((fmt->i_original_channels & AOUT_CHAN_PHYSMASK)
!= AOUT_CHANS_STEREO) != AOUT_CHANS_STEREO)
break; break;
...@@ -352,7 +356,7 @@ int aout_OutputNew (audio_output_t *aout, const audio_sample_format_t *fmtp) ...@@ -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); var_Change (aout, "stereo-mode", VLC_VAR_DELCHOICE, &val, NULL);
txt.psz_string = _("Stereo audio mode"); txt.psz_string = _("Stereo audio mode");
var_Change (aout, "stereo-mode", VLC_VAR_SETTEXT, &txt, NULL); 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; val.i_int = AOUT_VAR_CHAN_DOLBYS;
txt.psz_string = _("Dolby Surround"); txt.psz_string = _("Dolby Surround");
...@@ -367,9 +371,9 @@ int aout_OutputNew (audio_output_t *aout, const audio_sample_format_t *fmtp) ...@@ -367,9 +371,9 @@ int aout_OutputNew (audio_output_t *aout, const audio_sample_format_t *fmtp)
val.i_int = AOUT_VAR_CHAN_LEFT; val.i_int = AOUT_VAR_CHAN_LEFT;
txt.psz_string = _("Left"); txt.psz_string = _("Left");
var_Change (aout, "stereo-mode", VLC_VAR_ADDCHOICE, &val, &txt); 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. */ { /* 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); var_Change (aout, "stereo-mode", VLC_VAR_SETVALUE, &val, NULL);
} }
val.i_int = AOUT_VAR_CHAN_RIGHT; val.i_int = AOUT_VAR_CHAN_RIGHT;
...@@ -381,37 +385,8 @@ int aout_OutputNew (audio_output_t *aout, const audio_sample_format_t *fmtp) ...@@ -381,37 +385,8 @@ int aout_OutputNew (audio_output_t *aout, const audio_sample_format_t *fmtp)
} }
} }
aout_FormatPrepare (&fmt); aout_FormatPrepare (fmt);
aout_FormatPrint (aout, "output", &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;
}
return 0; return 0;
} }
...@@ -422,14 +397,11 @@ int aout_OutputNew (audio_output_t *aout, const audio_sample_format_t *fmtp) ...@@ -422,14 +397,11 @@ int aout_OutputNew (audio_output_t *aout, const audio_sample_format_t *fmtp)
*/ */
void aout_OutputDelete (audio_output_t *aout) void aout_OutputDelete (audio_output_t *aout)
{ {
aout_owner_t *owner = aout_owner (aout);
aout_assert_locked (aout); aout_assert_locked (aout);
var_DelCallback (aout, "stereo-mode", aout_ChannelsRestart, NULL); var_DelCallback (aout, "stereo-mode", aout_ChannelsRestart, NULL);
if (aout->stop != NULL) if (aout->stop != NULL)
aout->stop (aout); aout->stop (aout);
aout_FiltersPipelineDestroy (owner->converters, owner->nb_converters);
} }
int aout_OutputTimeGet (audio_output_t *aout, mtime_t *pts) int aout_OutputTimeGet (audio_output_t *aout, mtime_t *pts)
...@@ -448,20 +420,7 @@ 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) void aout_OutputPlay (audio_output_t *aout, block_t *block)
{ {
aout_owner_t *owner = aout_owner (aout);
aout_assert_locked (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); aout->play (aout, block);
} }
......
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