Commit 9804ce5c authored by Rémi Denis-Courmont's avatar Rémi Denis-Courmont

aout: remove (most) filters dependencies on audio_output_t

parent 2b255176
...@@ -29,8 +29,6 @@ ...@@ -29,8 +29,6 @@
/* Max input rate factor (1/4 -> 4) */ /* Max input rate factor (1/4 -> 4) */
# define AOUT_MAX_INPUT_RATE (4) # define AOUT_MAX_INPUT_RATE (4)
# define AOUT_MAX_FILTERS 10
enum { enum {
AOUT_RESAMPLING_NONE=0, AOUT_RESAMPLING_NONE=0,
AOUT_RESAMPLING_UP, AOUT_RESAMPLING_UP,
...@@ -103,11 +101,14 @@ static inline aout_owner_t *aout_owner (audio_output_t *aout) ...@@ -103,11 +101,14 @@ static inline aout_owner_t *aout_owner (audio_output_t *aout)
*****************************************************************************/ *****************************************************************************/
/* From filters.c : */ /* From filters.c : */
aout_filters_t *aout_FiltersNew(audio_output_t *, aout_filters_t *aout_FiltersNew(vlc_object_t *, const audio_sample_format_t *,
const audio_sample_format_t *, const audio_sample_format_t *,
const audio_sample_format_t *, const aout_request_vout_t *);
const aout_request_vout_t *); #define aout_FiltersNew(o,inf,outf,rv) \
void aout_FiltersDelete(audio_output_t *, aout_filters_t *); aout_FiltersNew(VLC_OBJECT(o),inf,outf,rv)
void aout_FiltersDelete(vlc_object_t *, aout_filters_t *);
#define aout_FiltersDelete(o,f) \
aout_FiltersDelete(VLC_OBJECT(o),f)
bool aout_FiltersAdjustResampling(aout_filters_t *, int); bool aout_FiltersAdjustResampling(aout_filters_t *, int);
block_t *aout_FiltersPlay(aout_filters_t *, block_t *, int rate); block_t *aout_FiltersPlay(aout_filters_t *, block_t *, int rate);
......
...@@ -251,9 +251,6 @@ error: ...@@ -251,9 +251,6 @@ error:
return -1; return -1;
} }
#define aout_FiltersPipelineCreate(obj,f,n,m,i,o) \
aout_FiltersPipelineCreate(VLC_OBJECT(obj),f,n,m,i,o)
/** /**
* Filters an audio buffer through a chain of filters. * Filters an audio buffer through a chain of filters.
*/ */
...@@ -272,6 +269,8 @@ static block_t *aout_FiltersPipelinePlay(filter_t *const *filters, ...@@ -272,6 +269,8 @@ static block_t *aout_FiltersPipelinePlay(filter_t *const *filters,
return block; return block;
} }
#define AOUT_MAX_FILTERS 10
struct aout_filters struct aout_filters
{ {
filter_t *rate_filter; /**< The filter adjusting samples count filter_t *rate_filter; /**< The filter adjusting samples count
...@@ -365,7 +364,7 @@ static int AppendFilter(vlc_object_t *obj, const char *type, const char *name, ...@@ -365,7 +364,7 @@ static int AppendFilter(vlc_object_t *obj, const char *type, const char *name,
} }
/* convert to the filter input format if necessary */ /* convert to the filter input format if necessary */
if (aout_FiltersPipelineCreate (filter, filters->tab, &filters->count, if (aout_FiltersPipelineCreate (obj, filters->tab, &filters->count,
max - 1, infmt, &filter->fmt_in.audio)) max - 1, infmt, &filter->fmt_in.audio))
{ {
msg_Err (filter, "cannot add user %s \"%s\" (skipped)", type, name); msg_Err (filter, "cannot add user %s \"%s\" (skipped)", type, name);
...@@ -381,11 +380,22 @@ static int AppendFilter(vlc_object_t *obj, const char *type, const char *name, ...@@ -381,11 +380,22 @@ static int AppendFilter(vlc_object_t *obj, const char *type, const char *name,
return 0; return 0;
} }
#undef aout_FiltersNew
/** /**
* Sets up the audio filters. * Sets a chain of audio filters up.
* \param obj parent object for the filters
* \param infmt chain input format [IN]
* \param outfmt chain output format [IN]
* \param request_vout visualization video output request callback
* \return a filters chain or NULL on failure
*
* \note
* *request_vout (if not NULL) must remain valid until aout_FiltersDelete().
*
* \bug
* If request_vout is non NULL, obj is assumed to be an audio_output_t pointer.
*/ */
aout_filters_t *aout_FiltersNew (audio_output_t *aout, aout_filters_t *aout_FiltersNew (vlc_object_t *obj,
const audio_sample_format_t *restrict infmt, const audio_sample_format_t *restrict infmt,
const audio_sample_format_t *restrict outfmt, const audio_sample_format_t *restrict outfmt,
const aout_request_vout_t *request_vout) const aout_request_vout_t *request_vout)
...@@ -400,23 +410,27 @@ aout_filters_t *aout_FiltersNew (audio_output_t *aout, ...@@ -400,23 +410,27 @@ aout_filters_t *aout_FiltersNew (audio_output_t *aout,
filters->count = 0; filters->count = 0;
/* Prepare format structure */ /* Prepare format structure */
aout_FormatPrint (aout, "input", infmt); aout_FormatPrint (obj, "input", infmt);
audio_sample_format_t input_format = *infmt; audio_sample_format_t input_format = *infmt;
audio_sample_format_t output_format = *outfmt; audio_sample_format_t output_format = *outfmt;
/* Now add user filters */ /* Callbacks (before reading values and also before return statement) */
var_AddCallback (aout, "visual", VisualizationCallback, NULL); if (request_vout != NULL)
var_AddCallback (aout, "equalizer", EqualizerCallback, NULL); {
var_AddCallback (obj, "equalizer", EqualizerCallback, NULL);
var_AddCallback (obj, "visual", VisualizationCallback, NULL);
}
/* Now add user filters */
if (!AOUT_FMT_LINEAR(outfmt)) if (!AOUT_FMT_LINEAR(outfmt))
{ /* Non-linear output: just convert formats, no filters/visu */ { /* Non-linear output: just convert formats, no filters/visu */
if (!AOUT_FMTS_IDENTICAL(infmt, outfmt)) if (!AOUT_FMTS_IDENTICAL(infmt, outfmt))
{ {
aout_FormatsPrint (aout, "pass-through:", infmt, outfmt); aout_FormatsPrint (obj, "pass-through:", infmt, outfmt);
filters->tab[0] = FindConverter(VLC_OBJECT(aout), infmt, outfmt); filters->tab[0] = FindConverter(obj, infmt, outfmt);
if (filters->tab[0] == NULL) if (filters->tab[0] == NULL)
{ {
msg_Err (aout, "cannot setup pass-through"); msg_Err (obj, "cannot setup pass-through");
goto error; goto error;
} }
filters->count++; filters->count++;
...@@ -425,39 +439,40 @@ aout_filters_t *aout_FiltersNew (audio_output_t *aout, ...@@ -425,39 +439,40 @@ aout_filters_t *aout_FiltersNew (audio_output_t *aout,
} }
/* parse user filter lists */ /* parse user filter lists */
if (var_InheritBool (aout, "audio-time-stretch")) if (var_InheritBool (obj, "audio-time-stretch"))
{ {
if (AppendFilter(VLC_OBJECT(aout), "audio filter", "scaletempo", if (AppendFilter(obj, "audio filter", "scaletempo",
filters, NULL, &input_format, &output_format) == 0) filters, NULL, &input_format, &output_format) == 0)
filters->rate_filter = filters->tab[filters->count - 1]; filters->rate_filter = filters->tab[filters->count - 1];
} }
char *str = var_InheritString (aout, "audio-filter"); char *str = var_InheritString (obj, "audio-filter");
if (str != NULL) if (str != NULL)
{ {
char *p = str, *name; char *p = str, *name;
while ((name = strsep (&p, " :")) != NULL) while ((name = strsep (&p, " :")) != NULL)
{ {
AppendFilter(VLC_OBJECT(aout), "audio filter", name, filters, AppendFilter(obj, "audio filter", name, filters,
NULL, &input_format, &output_format); NULL, &input_format, &output_format);
} }
free (str); free (str);
} }
char *visual = var_InheritString (aout, "audio-visual"); if (request_vout != NULL)
if (visual != NULL && strcasecmp (visual, "none"))
{ {
AppendFilter(VLC_OBJECT(aout), "visualization", visual, filters, char *visual = var_InheritString (obj, "audio-visual");
request_vout, &input_format, &output_format); if (visual != NULL && strcasecmp (visual, "none"))
AppendFilter(obj, "visualization", visual, filters,
request_vout, &input_format, &output_format);
free (visual);
} }
free (visual);
/* convert to the output format (minus resampling) if necessary */ /* convert to the output format (minus resampling) if necessary */
output_format.i_rate = input_format.i_rate; output_format.i_rate = input_format.i_rate;
if (aout_FiltersPipelineCreate (aout, filters->tab, &filters->count, if (aout_FiltersPipelineCreate (obj, filters->tab, &filters->count,
AOUT_MAX_FILTERS, &input_format, &output_format)) AOUT_MAX_FILTERS, &input_format, &output_format))
{ {
msg_Err (aout, "cannot setup filtering pipeline"); msg_Err (obj, "cannot setup filtering pipeline");
goto error; goto error;
} }
input_format = output_format; input_format = output_format;
...@@ -465,11 +480,11 @@ aout_filters_t *aout_FiltersNew (audio_output_t *aout, ...@@ -465,11 +480,11 @@ aout_filters_t *aout_FiltersNew (audio_output_t *aout,
/* insert the resampler */ /* insert the resampler */
output_format.i_rate = outfmt->i_rate; output_format.i_rate = outfmt->i_rate;
assert (AOUT_FMTS_IDENTICAL(&output_format, outfmt)); assert (AOUT_FMTS_IDENTICAL(&output_format, outfmt));
filters->resampler = FindResampler (VLC_OBJECT(aout), &input_format, filters->resampler = FindResampler (obj, &input_format,
&output_format); &output_format);
if (filters->resampler == NULL && input_format.i_rate != outfmt->i_rate) if (filters->resampler == NULL && input_format.i_rate != outfmt->i_rate)
{ {
msg_Err (aout, "cannot setup a resampler"); msg_Err (obj, "cannot setup a resampler");
goto error; goto error;
} }
if (filters->rate_filter == NULL) if (filters->rate_filter == NULL)
...@@ -479,23 +494,31 @@ aout_filters_t *aout_FiltersNew (audio_output_t *aout, ...@@ -479,23 +494,31 @@ aout_filters_t *aout_FiltersNew (audio_output_t *aout,
error: error:
aout_FiltersPipelineDestroy (filters->tab, filters->count); aout_FiltersPipelineDestroy (filters->tab, filters->count);
var_DelCallback (aout, "equalizer", EqualizerCallback, NULL); var_DelCallback (obj, "equalizer", EqualizerCallback, NULL);
var_DelCallback (aout, "visual", VisualizationCallback, NULL); var_DelCallback (obj, "visual", VisualizationCallback, NULL);
free (filters); free (filters);
return NULL; return NULL;
} }
#undef aout_FiltersDelete
/** /**
* Destroys the audio filters. * Destroys a chain of audio filters.
* \param obj object used with aout_FiltersNew()
* \param filters chain to be destroyed
* \bug
* obj must be NULL iff request_vout was NULL in aout_FiltersNew()
* (this implies obj is an audio_output_t pointer if non NULL).
*/ */
void aout_FiltersDelete (audio_output_t *aout, aout_filters_t *filters) void aout_FiltersDelete (vlc_object_t *obj, aout_filters_t *filters)
{ {
if (filters->resampler != NULL) if (filters->resampler != NULL)
aout_FiltersPipelineDestroy (&filters->resampler, 1); aout_FiltersPipelineDestroy (&filters->resampler, 1);
aout_FiltersPipelineDestroy (filters->tab, filters->count); aout_FiltersPipelineDestroy (filters->tab, filters->count);
var_DelCallback (aout, "equalizer", EqualizerCallback, NULL); if (obj != NULL)
var_DelCallback (aout, "visual", VisualizationCallback, NULL); {
var_DelCallback (obj, "equalizer", EqualizerCallback, NULL);
var_DelCallback (obj, "visual", VisualizationCallback, NULL);
}
free (filters); free (filters);
} }
......
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