[vlc-devel] [PATCHv2 2/9] aout: add the vlc_audio_meter API

Rémi Denis-Courmont remi at remlab.net
Fri Aug 21 20:56:54 CEST 2020


Le mercredi 19 août 2020, 22:25:56 EEST Thomas Guillem a écrit :
> This API will be used by the aout, and could be used by any visualisation
> module needing audio measurements.
> 
> This API allows to create "audio meter" filters plugins. This new type of
> filter is measuring audio blocks without modifying them and send the
> measurement via audio filters callbacks. These events are then propagated to
> vlc_audio_meter events.
> ---
>  include/vlc_aout.h       | 148 +++++++++++++++++++++++++
>  include/vlc_filter.h     |  18 ++++
>  src/Makefile.am          |   1 +
>  src/audio_output/meter.c | 225 +++++++++++++++++++++++++++++++++++++++
>  src/libvlccore.sym       |   7 ++
>  5 files changed, 399 insertions(+)
>  create mode 100644 src/audio_output/meter.c
> 
> diff --git a/include/vlc_aout.h b/include/vlc_aout.h
> index 5baa460f6de..1c35bba16eb 100644
> --- a/include/vlc_aout.h
> +++ b/include/vlc_aout.h
> @@ -24,6 +24,7 @@
>  #define VLC_AOUT_H 1
> 
>  #include <assert.h>
> +#include <vlc_list.h>
> 
>  /**
>   * \defgroup audio_output Audio output
> @@ -537,4 +538,151 @@ static inline int aout_TimeGet(audio_output_t *aout,
> vlc_tick_t *delay)
> 
>  /** @} */
> 
> +/**
> + * @defgroup audio_output__meter Audio meter API
> + */
> +
> +/**
> + * Audio loudness measurement
> + */
> +struct vlc_audio_loudness
> +{
> +    /** Momentary loudness (last 400 ms), in LUFS */
> +    double loudness_momentary;
> +    /** Short term loudness (last 3seconds), in LUFS */
> +    double loudness_shortterm;
> +    /** Integrated loudness (global), in LUFS */
> +    double loudness_integrated;
> +    /** Loudness range, in LU */
> +    double loudness_range;
> +    /** True Peak, in dBTP */
> +    double truepeak;
> +};
> +
> +/**
> + * Audio meter plugin opaque structure
> + *
> + * This opaque structure is returned by vlc_audio_meter_AddPlugin().
> + */
> +typedef struct vlc_audio_meter_plugin vlc_audio_meter_plugin;
> +
> +/**
> + * Audio meter events
> + *
> + * Triggered from vlc_audio_meter_Process() and vlc_audio_meter_Flush().
> + * Can be registered with vlc_audio_meter_AddPlugin().
> + */
> +struct vlc_audio_meter_events
> +{
> +    /**
> +     * Called when new loudness measurements are available
> +     *
> +     * @param date absolute date (likely in the future) of this measurement
> +     * @param loudness pointer to the loudness measurement
> +     * @param opaque pointer set by vlc_audio_meter_AddPlugin().
> +     */
> +    void (*on_loudness)(vlc_tick_t date, const struct vlc_audio_loudness
> *loudness, void *data); +};
> +
> +/**
> + * Audio meter structure
> + *
> + * Initialise with vlc_audio_meter_Init()
> + *
> + * @warning variables of this struct should not be used directly
> + */
> +struct vlc_audio_meter
> +{
> +    vlc_mutex_t lock;
> +    vlc_object_t *parent;
> +    const audio_sample_format_t *fmt;
> +
> +    struct vlc_list plugins;
> +};
> +
> +/**
> + * Initialize the audio meter structure
> + *
> + * @param meter allocated audio meter structure
> + * @param parent object that will be used to create audio filters
> + */
> +VLC_API void
> +vlc_audio_meter_Init(struct vlc_audio_meter *meter, vlc_object_t *parent);
> +#define vlc_audio_meter_Init(a,b) vlc_audio_meter_Init(a, VLC_OBJECT(b))
> +
> +/**
> + * Free allocated resource from the audio meter structure
> + *
> + * @param meter allocated audio meter structure
> + */
> +VLC_API void
> +vlc_audio_meter_Destroy(struct vlc_audio_meter *meter);
> +
> +/**
> + * Set or reset the audio format
> + *
> + * This will reload all plugins added with vlc_audio_meter_AddPlugin()
> + *
> + * @param meter audio meter structure
> + * @param fmt NULL to unload all plugins or a valid pointer to an audio
> format, + * must stay valid during the lifetime of the audio meter (until
> + * vlc_audio_meter_Reset() or vlc_audio_meter_Destroy() are called)
> + *
> + * @return VLC_SUCCESS on success, VLC_EGENERIC if a plugin failed to load
> + */
> +VLC_API int
> +vlc_audio_meter_Reset(struct vlc_audio_meter *meter, const
> audio_sample_format_t *fmt); +
> +/**
> + * Add an "audio meter" plugin
> + *
> + * The module to be loaded if meter->fmt is valid, otherwise, the module
> + * will be loaded from a next call to vlc_audio_meter_Reset()
> + *
> + * @param meter audio meter structure
> + * @param chain name of the module, can contain specific module options
> using + * the following chain convention:"name{option1=a,option2=b}"
> + * @param cbs pointer to a vlc_audio_meter_events structure, the
> + * structure must stay valid during the lifetime of the plugin
> + * @param cbs_data opaque pointer used by the callbacks
> + * @return a valid audio meter plugin, or NULL in case of error
> + */
> +VLC_API vlc_audio_meter_plugin *
> +vlc_audio_meter_AddPlugin(struct vlc_audio_meter *meter, const char *chain,
> +                          const struct vlc_audio_meter_events *cbs, void
> *cbs_data);

You can do that, but usually VLC code defines an owner structure that contains 
both cbs and data. Is there a problem with that pattern because I'm not sure 
that there is a reason to add yet another pattern here.

> +
> +/**
> + * Remove an "audio meter" plugin
> + *
> + * @param meter audio meter structure
> + * @param plugin plugin returned by vlc_audio_meter_AddPlugin()
> + */
> +VLC_API void
> +vlc_audio_meter_RemovePlugin(struct vlc_audio_meter *meter,
> vlc_audio_meter_plugin *plugin); +
> +/**
> + * Process an audio block
> + *
> + * vlc_audio_meter_events callbacks can be triggered from this function.
> + *
> + * @param meter audio meter structure
> + * @param block pointer to a block, this block won't be released of
> modified + * from this function
> + * @param date absolute date (likely in the future) when this block should
> be rendered + */
> +VLC_API void
> +vlc_audio_meter_Process(struct vlc_audio_meter *meter, block_t *block,
> vlc_tick_t date); +
> +/**
> + * Flush all "audio meter" plugins
> + *
> + * vlc_audio_meter_events callbacks can be triggered from this function.
> + *
> + * @param meter audio meter structure
> + */
> +VLC_API void
> +vlc_audio_meter_Flush(struct vlc_audio_meter *meter);
> +
> +/** @} */
> +
>  #endif /* VLC_AOUT_H */

-- 
Rémi Denis-Courmont




More information about the vlc-devel mailing list