VLC  4.0.0-dev
vlc_aout.h
Go to the documentation of this file.
1 /*****************************************************************************
2  * vlc_aout.h : audio output interface
3  *****************************************************************************
4  * Copyright (C) 2002-2011 VLC authors and VideoLAN
5  *
6  * Authors: Christophe Massiot <massiot@via.ecp.fr>
7  *
8  * This program is free software; you can redistribute it and/or modify it
9  * under the terms of the GNU Lesser General Public License as published by
10  * the Free Software Foundation; either version 2.1 of the License, or
11  * (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16  * GNU Lesser General Public License for more details.
17  *
18  * You should have received a copy of the GNU Lesser General Public License
19  * along with this program; if not, write to the Free Software Foundation,
20  * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
21  *****************************************************************************/
22 
23 #ifndef VLC_AOUT_H
24 #define VLC_AOUT_H 1
25 
26 #include <assert.h>
27 #include <vlc_list.h>
28 
29 /**
30  * \defgroup audio_output Audio output
31  * \ingroup output
32  * @{
33  * \file
34  * Audio output modules interface
35  */
36 
37 /* Buffers which arrive in advance of more than AOUT_MAX_ADVANCE_TIME
38  * will be considered as bogus and be trashed */
39 #define AOUT_MAX_ADVANCE_TIME (AOUT_MAX_PREPARE_TIME + VLC_TICK_FROM_SEC(1))
40 
41 /* Buffers which arrive in advance of more than AOUT_MAX_PREPARE_TIME
42  * will cause the calling thread to sleep */
43 #define AOUT_MAX_PREPARE_TIME VLC_TICK_FROM_SEC(2)
44 
45 /* Buffers which arrive after pts - AOUT_MIN_PREPARE_TIME will be trashed
46  * to avoid too heavy resampling */
47 #define AOUT_MIN_PREPARE_TIME AOUT_MAX_PTS_ADVANCE
48 
49 /* Tolerance values from EBU Recommendation 37 */
50 /** Maximum advance of actual audio playback time to coded PTS,
51  * above which downsampling will be performed */
52 #define AOUT_MAX_PTS_ADVANCE VLC_TICK_FROM_MS(40)
53 
54 /** Maximum delay of actual audio playback time from coded PTS,
55  * above which upsampling will be performed */
56 #define AOUT_MAX_PTS_DELAY VLC_TICK_FROM_MS(60)
57 
58 /* Max acceptable resampling (in %) */
59 #define AOUT_MAX_RESAMPLING 10
60 
61 #include "vlc_es.h"
62 
63 #define AOUT_FMTS_IDENTICAL( p_first, p_second ) ( \
64  ((p_first)->i_format == (p_second)->i_format) \
65  && AOUT_FMTS_SIMILAR(p_first, p_second) )
66 
67 /* Check if i_rate == i_rate and i_channels == i_channels */
68 #define AOUT_FMTS_SIMILAR( p_first, p_second ) ( \
69  ((p_first)->i_rate == (p_second)->i_rate) \
70  && ((p_first)->channel_type == (p_second)->channel_type) \
71  && ((p_first)->i_physical_channels == (p_second)->i_physical_channels)\
72  && ((p_first)->i_chan_mode == (p_second)->i_chan_mode) )
73 
74 #define AOUT_FMT_LINEAR( p_format ) \
75  (aout_BitsPerSample((p_format)->i_format) != 0)
76 
77 #define VLC_CODEC_SPDIFL VLC_FOURCC('s','p','d','i')
78 #define VLC_CODEC_SPDIFB VLC_FOURCC('s','p','d','b')
79 
80 #define AOUT_FMT_SPDIF( p_format ) \
81  ( ((p_format)->i_format == VLC_CODEC_SPDIFL) \
82  || ((p_format)->i_format == VLC_CODEC_SPDIFB) \
83  || ((p_format)->i_format == VLC_CODEC_A52) \
84  || ((p_format)->i_format == VLC_CODEC_DTS) )
85 
86 #define AOUT_FMT_HDMI( p_format ) \
87  ( (p_format)->i_format == VLC_CODEC_EAC3 \
88  ||(p_format)->i_format == VLC_CODEC_DTSHD \
89  ||(p_format)->i_format == VLC_CODEC_TRUEHD \
90  ||(p_format)->i_format == VLC_CODEC_MLP \
91  )
92 
93 /* Values used for the audio-channels object variable */
94 #define AOUT_VAR_CHAN_UNSET 0 /* must be zero */
95 #define AOUT_VAR_CHAN_STEREO 1
96 #define AOUT_VAR_CHAN_RSTEREO 2
97 #define AOUT_VAR_CHAN_LEFT 3
98 #define AOUT_VAR_CHAN_RIGHT 4
99 #define AOUT_VAR_CHAN_DOLBYS 5
100 /* deprecated: AOUT_VAR_CHAN_HEADPHONES 6, use AOUT_MIX_MODE_BINAURAL */
101 #define AOUT_VAR_CHAN_MONO 7
102 
103 #define AOUT_MIX_MODE_UNSET 0
104 #define AOUT_MIX_MODE_STEREO 1
105 #define AOUT_MIX_MODE_BINAURAL 2
106 #define AOUT_MIX_MODE_4_0 3
107 #define AOUT_MIX_MODE_5_1 4
108 #define AOUT_MIX_MODE_7_1 5
109 
110 /*****************************************************************************
111  * Main audio output structures
112  *****************************************************************************/
113 
114 /* Size of a frame for S/PDIF output. */
115 #define AOUT_SPDIF_SIZE 6144
116 
117 /* Number of samples in an A/52 frame. */
118 #define A52_FRAME_NB 1536
119 
120 /* FIXME to remove once aout.h is cleaned a bit more */
121 #include <vlc_block.h>
122 
124  void (*timing_report)(audio_output_t *, vlc_tick_t system_now, vlc_tick_t pts);
125  void (*volume_report)(audio_output_t *, float);
126  void (*mute_report)(audio_output_t *, bool);
127  void (*policy_report)(audio_output_t *, bool);
128  void (*device_report)(audio_output_t *, const char *);
129  void (*hotplug_report)(audio_output_t *, const char *, const char *);
130  void (*restart_request)(audio_output_t *, unsigned);
131  int (*gain_request)(audio_output_t *, float);
132 };
133 
134 /** Audio output object
135  *
136  * The audio output object is the abstraction for rendering decoded
137  * (or pass-through) audio samples. In addition to playing samples,
138  * the abstraction exposes controls for pause/resume, flush/drain,
139  * changing the volume or mut flag, and listing and changing output device.
140  *
141  * An audio output can be in one of three different states:
142  * stopped, playing or paused.
143  * The audio output is always created in stopped state and is always destroyed
144  * in that state also. It is moved from stopped to playing state by start(),
145  * and from playing or paused states back to stopped state by stop().
146  **/
147 struct audio_output
148 {
149  struct vlc_object_t obj;
150 
151  void *sys; /**< Private data for callbacks */
152 
154  /**< Starts a new stream (mandatory, cannot be NULL).
155  *
156  * This callback changes the audio output from stopped to playing state
157  * (if succesful). After the callback returns, time_get(), play(),
158  * pause(), flush() and eventually stop() callbacks may be called.
159  *
160  * \param fmt input stream sample format upon entry,
161  * output stream sample format upon return [IN/OUT]
162  * \return VLC_SUCCESS on success, non-zero on failure
163  *
164  * \note This callback can only be called while the audio output is in
165  * stopped state. There can be only one stream per audio output at a time.
166  *
167  * \note This callbacks needs not be reentrant.
168  */
169 
170  void (*stop)(audio_output_t *);
171  /**< Stops the existing stream (mandatory, cannot be NULL).
172  *
173  * This callback terminates the current audio stream,
174  * and returns the audio output to stopped state.
175  *
176  * \note This callback needs not be reentrant.
177  */
178 
179  int (*time_get)(audio_output_t *, vlc_tick_t *delay);
180  /**< Estimates playback buffer latency (mandatory, cannot be NULL).
181  *
182  * This callback computes an estimation of the delay until the current
183  * tail of the audio output buffer would be rendered. This is essential
184  * for (lip) synchronization and long term drift between the audio output
185  * clock and the media upstream clock (if any).
186  *
187  * If the audio output clock is exactly synchronized with the system
188  * monotonic clock (i.e. vlc_tick_now()), then aout_TimeGetDefault() can
189  * implement this callback. In that case, drain must be implemented (since
190  * the default implementation uses the delay to wait for the end of the
191  * stream).
192  *
193  * This callback is called before the first play() in order to get the
194  * initial delay (the hw latency). Most modules won't be able to know this
195  * latency before the first play. In that case, they should return -1 and
196  * handle the first play() date, cf. play() documentation.
197  *
198  * \param delay pointer to the delay until the next sample to be written
199  * to the playback buffer is rendered [OUT]
200  * \return 0 on success, non-zero on failure or lack of data
201  *
202  * \note This callback cannot be called in stopped state.
203  */
204 
205  void (*play)(audio_output_t *, block_t *block, vlc_tick_t date);
206  /**< Queues a block of samples for playback (mandatory, cannot be NULL).
207  *
208  * The first play() date (after a flush()/start()) will be most likely in
209  * the future. Modules that don't know the hw latency before a first play
210  * (when they return -1 from the first time_get()) will need to handle
211  * this. They can play a silence buffer with 'length = date - now()', or
212  * configure their render callback to start at the given date.
213  *
214  * \param block block of audio samples
215  * \param date intended system time to render the first sample
216  *
217  * \note This callback cannot be called in stopped state.
218  */
219 
220  void (*pause)( audio_output_t *, bool pause, vlc_tick_t date);
221  /**< Pauses or resumes playback (mandatory, cannot be NULL).
222  *
223  * This callback pauses or resumes audio playback as quickly as possible.
224  * When pausing, it is desirable to stop producing sound immediately, but
225  * retain already queued audio samples in the buffer to play when later
226  * when resuming.
227  *
228  * If pausing is impossible, then aout_PauseDefault() can provide a
229  * fallback implementation of this callback.
230  *
231  * \param pause pause if true, resume from pause if false
232  * \param date timestamp when the pause or resume was requested
233  *
234  * \note This callback cannot be called in stopped state.
235  */
236 
237  void (*flush)( audio_output_t *);
238  /**< Flushes the playback buffers (mandatory, cannot be NULL).
239  *
240  * \param wait true to wait for playback of pending buffers (drain),
241  * false to discard pending buffers (flush)
242  *
243  * \note This callback cannot be called in stopped state.
244  */
245  void (*drain)(audio_output_t *);
246  /**< Drain the playback buffers (can be NULL).
247  *
248  * If NULL, the caller will wait for the delay returned by time_get before
249  * calling stop().
250  */
251 
252  int (*volume_set)(audio_output_t *, float volume);
253  /**< Changes playback volume (optional, may be NULL).
254  *
255  * \param volume requested volume (0. = mute, 1. = nominal)
256  *
257  * \note The volume is always a positive number.
258  *
259  * \warning A stream may or may not have been started when called.
260  * \warning This callback may be called concurrently with
261  * time_get(), play(), pause() or flush().
262  * It will however be protected against concurrent calls to
263  * start(), stop(), volume_set(), mute_set() or device_select().
264  */
265 
266  int (*mute_set)(audio_output_t *, bool mute);
267  /**< Changes muting (optinal, may be NULL).
268  *
269  * \param mute true to mute, false to unmute
270  * \warning The same constraints apply as with volume_set().
271  */
272 
273  int (*device_select)(audio_output_t *, const char *id);
274  /**< Selects an audio output device (optional, may be NULL).
275  *
276  * \param id nul-terminated device unique identifier.
277  * \return 0 on success, non-zero on failure.
278  *
279  * \warning The same constraints apply as with volume_set().
280  */
281 
282  struct {
283  bool headphones; /**< Default to false, set it to true if the current
284  sink is using headphones */
286  /**< Current sink informations set by the module from the start() function */
287 
288  const struct vlc_audio_output_events *events;
289 };
290 
291 typedef enum
292 {
305 
306 static_assert(AOUT_CHANIDX_MAX == AOUT_CHAN_MAX, "channel count mismatch");
307 
308 #define AOUT_CHAN_REMAP_INIT { \
309  AOUT_CHANIDX_LEFT, \
310  AOUT_CHANIDX_RIGHT, \
311  AOUT_CHANIDX_MIDDLELEFT, \
312  AOUT_CHANIDX_MIDDLERIGHT, \
313  AOUT_CHANIDX_REARLEFT, \
314  AOUT_CHANIDX_REARRIGHT, \
315  AOUT_CHANIDX_REARCENTER, \
316  AOUT_CHANIDX_CENTER, \
317  AOUT_CHANIDX_LFE, \
318 }
319 
320 /**
321  * It describes the audio channel order VLC expect.
322  */
323 static const uint32_t pi_vlc_chan_order_wg4[] =
324 {
329 };
330 
331 #define AOUT_RESTART_FILTERS 0x1
332 #define AOUT_RESTART_OUTPUT (AOUT_RESTART_FILTERS|0x2)
333 #define AOUT_RESTART_STEREOMODE (AOUT_RESTART_OUTPUT|0x4)
334 
335 /*****************************************************************************
336  * Prototypes
337  *****************************************************************************/
338 
339 /**
340  * This function computes the reordering needed to go from pi_chan_order_in to
341  * pi_chan_order_out.
342  * If pi_chan_order_in or pi_chan_order_out is NULL, it will assume that vlc
343  * internal (WG4) order is requested.
344  */
345 VLC_API unsigned aout_CheckChannelReorder( const uint32_t *, const uint32_t *,
346  uint32_t mask, uint8_t *table );
347 VLC_API void aout_ChannelReorder(void *, size_t, uint8_t, const uint8_t *, vlc_fourcc_t);
348 
349 VLC_API void aout_Interleave(void *dst, const void *const *planes,
350  unsigned samples, unsigned channels,
351  vlc_fourcc_t fourcc);
352 VLC_API void aout_Deinterleave(void *dst, const void *src, unsigned samples,
353  unsigned channels, vlc_fourcc_t fourcc);
354 
355 /**
356  * This function will compute the extraction parameter into pi_selection to go
357  * from i_channels with their type given by pi_order_src[] into the order
358  * describe by pi_order_dst.
359  * It will also set :
360  * - *pi_channels as the number of channels that will be extracted which is
361  * lower (in case of non understood channels type) or equal to i_channels.
362  * - the layout of the channels (*pi_layout).
363  *
364  * It will return true if channel extraction is really needed, in which case
365  * aout_ChannelExtract must be used
366  *
367  * XXX It must be used when the source may have channel type not understood
368  * by VLC. In this case the channel type pi_order_src[] must be set to 0.
369  * XXX It must also be used if multiple channels have the same type.
370  */
371 VLC_API bool aout_CheckChannelExtraction( int *pi_selection, uint32_t *pi_layout, int *pi_channels, const uint32_t pi_order_dst[AOUT_CHAN_MAX], const uint32_t *pi_order_src, int i_channels );
372 
373 /**
374  * Do the actual channels extraction using the parameters created by
375  * aout_CheckChannelExtraction.
376  *
377  * XXX this function does not work in place (p_dst and p_src must not overlap).
378  * XXX Only 8, 16, 32, 64 bits per sample are supported.
379  */
380 VLC_API void aout_ChannelExtract( void *p_dst, int i_dst_channels, const void *p_src, int i_src_channels, int i_sample_count, const int *pi_selection, int i_bits_per_sample );
381 
382 /* */
383 static inline unsigned aout_FormatNbChannels(const audio_sample_format_t *fmt)
384 {
385  return vlc_popcount(fmt->i_physical_channels);
386 }
387 
388 VLC_API unsigned int aout_BitsPerSample( vlc_fourcc_t i_format ) VLC_USED;
390 VLC_API void aout_FormatPrint(vlc_object_t *, const char *,
391  const audio_sample_format_t *);
392 #define aout_FormatPrint(o, t, f) aout_FormatPrint(VLC_OBJECT(o), t, f)
394 
395 #define AOUT_VOLUME_DEFAULT 256
396 #define AOUT_VOLUME_MAX 512
397 
399 VLC_API int aout_VolumeSet (audio_output_t *, float);
400 VLC_API int aout_VolumeUpdate (audio_output_t *, int, float *);
402 VLC_API int aout_MuteSet (audio_output_t *, bool);
404 VLC_API int aout_DeviceSet (audio_output_t *, const char *);
405 VLC_API int aout_DevicesList (audio_output_t *, char ***, char ***);
406 
407 /**
408  * Report change of configured audio volume to the core and UI.
409  */
410 static inline void aout_VolumeReport(audio_output_t *aout, float volume)
411 {
412  aout->events->volume_report(aout, volume);
413 }
414 
415 /**
416  * Report change of muted flag to the core and UI.
417  */
418 static inline void aout_MuteReport(audio_output_t *aout, bool mute)
419 {
420  aout->events->mute_report(aout, mute);
421 }
422 
423 /**
424  * Report audio policy status.
425  * \param cork true to request a cork, false to undo any pending cork.
426  */
427 static inline void aout_PolicyReport(audio_output_t *aout, bool cork)
428 {
429  aout->events->policy_report(aout, cork);
430 }
431 
432 /**
433  * Report change of output device.
434  */
435 static inline void aout_DeviceReport(audio_output_t *aout, const char *id)
436 {
437  aout->events->device_report(aout, id);
438 }
439 
440 /**
441  * Report a device hot-plug event.
442  * @param id device ID
443  * @param name human-readable device name (NULL for hot unplug)
444  */
445 static inline void aout_HotplugReport(audio_output_t *aout,
446  const char *id, const char *name)
447 {
448  aout->events->hotplug_report(aout, id, name);
449 }
450 
451 /**
452  * Request a change of software audio amplification.
453  * \param gain linear amplitude gain (must be positive)
454  * \warning Values in excess 1.0 may cause overflow and distorsion.
455  */
456 static inline int aout_GainRequest(audio_output_t *aout, float gain)
457 {
458  return aout->events->gain_request(aout, gain);
459 }
460 
461 static inline void aout_RestartRequest(audio_output_t *aout, unsigned mode)
462 {
463  aout->events->restart_request(aout, mode);
464 }
465 
466 /**
467  * Default implementation for audio_output_t.time_get
468  */
469 static inline int aout_TimeGetDefault(audio_output_t *aout,
470  vlc_tick_t *restrict delay)
471 {
472  (void) aout; (void) delay;
473  return -1;
474 }
475 
476 /**
477  * Default implementation for audio_output_t.pause
478  *
479  * \warning This default callback implementation is suboptimal as it will
480  * discard some audio samples.
481  * Do not use this unless there are really no possible better alternatives.
482  */
483 static inline void aout_PauseDefault(audio_output_t *aout, bool paused,
485 {
486  if (paused)
487  aout->flush(aout);
488  (void) date;
489 }
490 
491 /* Audio output filters */
492 
493 /**
494  * Enable or disable an audio filter ("audio-filter")
495  *
496  * \param aout a valid audio output
497  * \param name a valid filter name
498  * \param add true to add the filter, false to remove it
499  * \return 0 on success, non-zero on failure.
500  */
501 VLC_API int aout_EnableFilter(audio_output_t *aout, const char *name, bool add);
502 
503 typedef struct
504 {
505  /**
506  * If the remap order differs from the WG4 order, a remap audio filter will
507  * be inserted to remap channels according to this array.
508  */
509  int remap[AOUT_CHANIDX_MAX];
510  /**
511  * If true, a filter will be inserted to add a headphones effect (like a
512  * binauralizer audio filter).
513  */
514  bool headphones;
516 
517 #define AOUT_FILTERS_CFG_INIT (aout_filters_cfg_t) \
518  { .remap = AOUT_CHAN_REMAP_INIT, \
519  .headphones = false, \
520  };
521 
522 typedef struct aout_filters aout_filters_t;
523 
525  const audio_sample_format_t *,
526  const audio_sample_format_t *,
527  const aout_filters_cfg_t *cfg) VLC_USED;
528 #define aout_FiltersNew(o,inf,outf,remap) \
529  aout_FiltersNew(VLC_OBJECT(o),inf,outf,remap)
531 #define aout_FiltersDelete(o,f) \
532  aout_FiltersDelete(VLC_OBJECT(o),f)
538 
540 
541 static inline int aout_TimeGet(audio_output_t *aout, vlc_tick_t *delay)
542 {
543  return aout->time_get(aout, delay);
544 }
545 
546 /** @} */
547 
548 /**
549  * @defgroup audio_output__meter Audio meter API
550  */
551 
552 /**
553  * Audio loudness measurement
554  */
555 struct vlc_audio_loudness
556 {
557  /** Momentary loudness (last 400 ms), in LUFS */
558  double loudness_momentary;
559  /** Short term loudness (last 3seconds), in LUFS */
560  double loudness_shortterm;
561  /** Integrated loudness (global), in LUFS */
562  double loudness_integrated;
563  /** Loudness range, in LU */
564  double loudness_range;
565  /** True Peak, in dBTP */
566  double truepeak;
567 };
568 
569 /**
570  * Audio meter callback
571  *
572  * Triggered from vlc_audio_meter_Process() and vlc_audio_meter_Flush().
573  */
574 struct vlc_audio_meter_cbs
575 {
576  /**
577  * Called when new loudness measurements are available
578  *
579  * @param date absolute date (likely in the future) of this measurement
580  * @param loudness pointer to the loudness measurement
581  * @param opaque pointer set by vlc_audio_meter_AddPlugin().
582  */
583  void (*on_loudness)(vlc_tick_t date, const struct vlc_audio_loudness *loudness, void *data);
584 };
585 
586 /**
587  * Audio meter plugin opaque structure
588  *
589  * This opaque structure is returned by vlc_audio_meter_AddPlugin().
590  */
592 
593 /**
594  * Audio meter plugin owner structure
595  *
596  * Used to setup callbacks and private data
597  *
598  * Can be registered with vlc_audio_meter_AddPlugin().
599  */
601 {
602  const struct vlc_audio_meter_cbs *cbs;
603  void *sys;
604 };
605 
606 /**
607  * Audio meter structure
608  *
609  * Initialise with vlc_audio_meter_Init()
610  *
611  * @warning variables of this struct should not be used directly
612  */
613 struct vlc_audio_meter
614 {
618 
619  struct vlc_list plugins;
620 };
621 
622 /**
623  * Initialize the audio meter structure
624  *
625  * @param meter allocated audio meter structure
626  * @param parent object that will be used to create audio filters
627  */
628 VLC_API void
629 vlc_audio_meter_Init(struct vlc_audio_meter *meter, vlc_object_t *parent);
630 #define vlc_audio_meter_Init(a,b) vlc_audio_meter_Init(a, VLC_OBJECT(b))
631 
632 /**
633  * Free allocated resource from the audio meter structure
634  *
635  * @param meter allocated audio meter structure
636  */
637 VLC_API void
639 
640 /**
641  * Set or reset the audio format
642  *
643  * This will reload all plugins added with vlc_audio_meter_AddPlugin()
644  *
645  * @param meter audio meter structure
646  * @param fmt NULL to unload all plugins or a valid pointer to an audio format,
647  * must stay valid during the lifetime of the audio meter (until
648  * vlc_audio_meter_Reset() or vlc_audio_meter_Destroy() are called)
649  *
650  * @return VLC_SUCCESS on success, VLC_EGENERIC if a plugin failed to load
651  */
652 VLC_API int
654 
655 /**
656  * Add an "audio meter" plugin
657  *
658  * The module to be loaded if meter->fmt is valid, otherwise, the module
659  * will be loaded from a next call to vlc_audio_meter_Reset()
660  *
661  * @param meter audio meter structure
662  * @param chain name of the module, can contain specific module options using
663  * the following chain convention:"name{option1=a,option2=b}"
664  * @param cbs pointer to a vlc_audio_meter_events structure, the
665  * structure must stay valid during the lifetime of the plugin
666  * @param cbs_data opaque pointer used by the callbacks
667  * @return a valid audio meter plugin, or NULL in case of error
668  */
670 vlc_audio_meter_AddPlugin(struct vlc_audio_meter *meter, const char *chain,
671  const struct vlc_audio_meter_plugin_owner *owner);
672 
673 /**
674  * Remove an "audio meter" plugin
675  *
676  * @param meter audio meter structure
677  * @param plugin plugin returned by vlc_audio_meter_AddPlugin()
678  */
679 VLC_API void
681 
682 /**
683  * Process an audio block
684  *
685  * vlc_audio_meter_events callbacks can be triggered from this function.
686  *
687  * @param meter audio meter structure
688  * @param block pointer to a block, this block won't be released of modified
689  * from this function
690  * @param date absolute date (likely in the future) when this block should be rendered
691  */
692 VLC_API void
693 vlc_audio_meter_Process(struct vlc_audio_meter *meter, block_t *block, vlc_tick_t date);
694 
695 /**
696  * Flush all "audio meter" plugins
697  *
698  * vlc_audio_meter_events callbacks can be triggered from this function.
699  *
700  * @param meter audio meter structure
701  */
702 VLC_API void
704 
705 /** @} */
706 
707 #endif /* VLC_AOUT_H */
AOUT_CHAN_RIGHT
#define AOUT_CHAN_RIGHT
Definition: vlc_es.h:119
AOUT_CHAN_MIDDLERIGHT
#define AOUT_CHAN_MIDDLERIGHT
Definition: vlc_es.h:124
vlc_es.h
VLC_API
#define VLC_API
Definition: fourcc_gen.c:31
AOUT_CHANIDX_LFE
@ AOUT_CHANIDX_LFE
Definition: vlc_aout.h:303
aout_MuteReport
static void aout_MuteReport(audio_output_t *aout, bool mute)
Report change of muted flag to the core and UI.
Definition: vlc_aout.h:419
aout_BitsPerSample
VLC_EXPORT unsigned int aout_BitsPerSample(vlc_fourcc_t i_format)
Definition: common.c:41
aout_DeviceSet
VLC_EXPORT int aout_DeviceSet(audio_output_t *, const char *)
Selects an audio output device.
Definition: output.c:882
aout_FormatNbChannels
static unsigned aout_FormatNbChannels(const audio_sample_format_t *fmt)
Definition: vlc_aout.h:384
aout_VolumeGet
VLC_EXPORT float aout_VolumeGet(audio_output_t *)
Gets the volume of the audio output stream (independent of mute).
Definition: output.c:795
vlc_common.h
AOUT_CHANIDX_DISABLE
@ AOUT_CHANIDX_DISABLE
Definition: vlc_aout.h:294
aout_FiltersChangeViewpoint
VLC_EXPORT void aout_FiltersChangeViewpoint(aout_filters_t *, const vlc_viewpoint_t *vp)
Definition: filters.c:789
aout_VolumeReport
static void aout_VolumeReport(audio_output_t *aout, float volume)
Report change of configured audio volume to the core and UI.
Definition: vlc_aout.h:411
aout_HotplugReport
static void aout_HotplugReport(audio_output_t *aout, const char *id, const char *name)
Report a device hot-plug event.
Definition: vlc_aout.h:446
vlc_audio_meter::parent
vlc_object_t * parent
Definition: vlc_aout.h:617
vlc_audio_meter_Reset
VLC_EXPORT int vlc_audio_meter_Reset(struct vlc_audio_meter *meter, const audio_sample_format_t *fmt)
Set or reset the audio format.
Definition: meter.c:152
AOUT_CHAN_CENTER
#define AOUT_CHAN_CENTER
Definition: vlc_es.h:117
aout_TimeGetDefault
static int aout_TimeGetDefault(audio_output_t *aout, vlc_tick_t *restrict delay)
Default implementation for audio_output_t.time_get.
Definition: vlc_aout.h:470
audio_output::obj
struct vlc_object_t obj
Definition: vlc_aout.h:150
aout_GainRequest
static int aout_GainRequest(audio_output_t *aout, float gain)
Request a change of software audio amplification.
Definition: vlc_aout.h:457
AOUT_CHAN_REARCENTER
#define AOUT_CHAN_REARCENTER
Definition: vlc_es.h:120
audio_output::play
void(* play)(audio_output_t *, block_t *block, vlc_tick_t date)
Queues a block of samples for playback (mandatory, cannot be NULL).
Definition: vlc_aout.h:206
vlc_audio_output_events::gain_request
int(* gain_request)(audio_output_t *, float)
Definition: vlc_aout.h:132
aout_FiltersFlush
VLC_EXPORT void aout_FiltersFlush(aout_filters_t *)
Definition: filters.c:781
aout_DeviceReport
static void aout_DeviceReport(audio_output_t *aout, const char *id)
Report change of output device.
Definition: vlc_aout.h:436
vlc_audio_output_events::mute_report
void(* mute_report)(audio_output_t *, bool)
Definition: vlc_aout.h:127
vlc_audio_output_events
Definition: vlc_aout.h:124
aout_FiltersAdjustResampling
VLC_EXPORT bool aout_FiltersAdjustResampling(aout_filters_t *, int)
Definition: filters.c:700
video_format_t
video format description
Definition: vlc_es.h:351
vlc_audio_meter_RemovePlugin
VLC_EXPORT void vlc_audio_meter_RemovePlugin(struct vlc_audio_meter *meter, vlc_audio_meter_plugin *plugin)
Remove an "audio meter" plugin.
Definition: meter.c:130
vlc_viewpoint_t
Viewpoints.
Definition: vlc_viewpoint.h:41
AOUT_CHANIDX_REARLEFT
@ AOUT_CHANIDX_REARLEFT
Definition: vlc_aout.h:299
aout_FiltersPlay
VLC_EXPORT block_t * aout_FiltersPlay(aout_filters_t *, block_t *, float rate)
Definition: filters.c:712
vlc_audio_meter_plugin_owner
Audio meter plugin owner structure.
Definition: vlc_aout.h:601
vlc_list
Doubly-linked list node.
Definition: vlc_list.h:43
audio_format_t::i_physical_channels
uint16_t i_physical_channels
Definition: vlc_es.h:88
audio_format_t
audio format description
Definition: vlc_es.h:81
vlc_audio_meter::lock
vlc_mutex_t lock
Definition: vlc_aout.h:616
vlc_mutex_t
Mutex.
Definition: vlc_threads.h:225
vlc_audio_meter::fmt
const audio_sample_format_t * fmt
Definition: vlc_aout.h:618
vlc_audio_output_events::volume_report
void(* volume_report)(audio_output_t *, float)
Definition: vlc_aout.h:126
vlc_audio_loudness::truepeak
double truepeak
True Peak, in dBTP.
Definition: vlc_aout.h:567
audio_output::pause
void(* pause)(audio_output_t *, bool pause, vlc_tick_t date)
Pauses or resumes playback (mandatory, cannot be NULL).
Definition: vlc_aout.h:221
aout_MuteSet
VLC_EXPORT int aout_MuteSet(audio_output_t *, bool)
Sets the audio output stream mute flag.
Definition: output.c:856
aout_ChannelReorder
VLC_EXPORT void aout_ChannelReorder(void *, size_t, uint8_t, const uint8_t *, vlc_fourcc_t)
aout_filters
Definition: filters.c:343
audio_output
Audio output object.
Definition: vlc_aout.h:148
aout_FiltersNew
#define aout_FiltersNew(o, inf, outf, remap)
Definition: vlc_aout.h:529
aout_PolicyReport
static void aout_PolicyReport(audio_output_t *aout, bool cork)
Report audio policy status.
Definition: vlc_aout.h:428
aout_EnableFilter
VLC_EXPORT int aout_EnableFilter(audio_output_t *aout, const char *name, bool add)
Enable or disable an audio filter ("audio-filter")
Definition: common.c:539
aout_FormatPrintChannels
const VLC_EXPORT char * aout_FormatPrintChannels(const audio_sample_format_t *)
Definition: common.c:105
vlc_audio_loudness::loudness_integrated
double loudness_integrated
Integrated loudness (global), in LUFS.
Definition: vlc_aout.h:563
AOUT_CHAN_MIDDLELEFT
#define AOUT_CHAN_MIDDLELEFT
Definition: vlc_es.h:123
vlc_audio_meter
Audio meter structure.
Definition: vlc_aout.h:614
AOUT_CHAN_LFE
#define AOUT_CHAN_LFE
Definition: vlc_es.h:125
filter_t
Structure describing a filter.
Definition: vlc_filter.h:215
vlc_audio_meter_cbs::on_loudness
void(* on_loudness)(vlc_tick_t date, const struct vlc_audio_loudness *loudness, void *data)
Called when new loudness measurements are available.
Definition: vlc_aout.h:584
vlc_tick_t
int64_t vlc_tick_t
High precision date or time interval.
Definition: vlc_tick.h:45
AOUT_CHANIDX_MIDDLELEFT
@ AOUT_CHANIDX_MIDDLELEFT
Definition: vlc_aout.h:297
vlc_audio_loudness::loudness_range
double loudness_range
Loudness range, in LU.
Definition: vlc_aout.h:565
AOUT_CHANIDX_REARRIGHT
@ AOUT_CHANIDX_REARRIGHT
Definition: vlc_aout.h:300
audio_output::headphones
bool headphones
Default to false, set it to true if the current sink is using headphones.
Definition: vlc_aout.h:284
vlc_audio_meter_Process
VLC_EXPORT void vlc_audio_meter_Process(struct vlc_audio_meter *meter, block_t *block, vlc_tick_t date)
Process an audio block.
Definition: meter.c:190
aout_RestartRequest
static void aout_RestartRequest(audio_output_t *aout, unsigned mode)
Definition: vlc_aout.h:462
vlc_chan_order_idx_t
vlc_chan_order_idx_t
Definition: vlc_aout.h:292
aout_filter_GetVout
VLC_EXPORT vout_thread_t * aout_filter_GetVout(filter_t *, const video_format_t *)
Definition: filters.c:383
AOUT_CHANIDX_CENTER
@ AOUT_CHANIDX_CENTER
Definition: vlc_aout.h:302
audio_output::device_select
int(* device_select)(audio_output_t *, const char *id)
Selects an audio output device (optional, may be NULL).
Definition: vlc_aout.h:274
aout_Deinterleave
VLC_EXPORT void aout_Deinterleave(void *dst, const void *src, unsigned samples, unsigned channels, vlc_fourcc_t fourcc)
vlc_list.h
AOUT_CHAN_MAX
#define AOUT_CHAN_MAX
Definition: vlc_es.h:153
vlc_audio_meter_plugin_owner::sys
void * sys
Definition: vlc_aout.h:604
vlc_audio_meter_Init
#define vlc_audio_meter_Init(a, b)
Definition: vlc_aout.h:631
aout_filters_cfg_t::headphones
bool headphones
If true, a filter will be inserted to add a headphones effect (like a binauralizer audio filter).
Definition: vlc_aout.h:515
aout_Interleave
VLC_EXPORT void aout_Interleave(void *dst, const void *const *planes, unsigned samples, unsigned channels, vlc_fourcc_t fourcc)
aout_ChannelExtract
VLC_EXPORT void aout_ChannelExtract(void *p_dst, int i_dst_channels, const void *p_src, int i_src_channels, int i_sample_count, const int *pi_selection, int i_bits_per_sample)
Do the actual channels extraction using the parameters created by aout_CheckChannelExtraction.
Definition: common.c:445
audio_output::stop
void(* stop)(audio_output_t *)
Stops the existing stream (mandatory, cannot be NULL).
Definition: vlc_aout.h:171
vlc_audio_output_events::timing_report
void(* timing_report)(audio_output_t *, vlc_tick_t system_now, vlc_tick_t pts)
Definition: vlc_aout.h:125
static_assert
#define static_assert
Definition: vlc_fixups.h:370
AOUT_CHAN_REARRIGHT
#define AOUT_CHAN_REARRIGHT
Definition: vlc_es.h:122
vlc_audio_output_events::hotplug_report
void(* hotplug_report)(audio_output_t *, const char *, const char *)
Definition: vlc_aout.h:130
AOUT_CHAN_LEFT
#define AOUT_CHAN_LEFT
Definition: vlc_es.h:118
vlc_audio_meter_Flush
VLC_EXPORT void vlc_audio_meter_Flush(struct vlc_audio_meter *meter)
Flush all "audio meter" plugins.
Definition: meter.c:212
audio_output::volume_set
int(* volume_set)(audio_output_t *, float volume)
Changes playback volume (optional, may be NULL).
Definition: vlc_aout.h:253
aout_PauseDefault
static void aout_PauseDefault(audio_output_t *aout, bool paused, vlc_tick_t date)
Default implementation for audio_output_t.pause.
Definition: vlc_aout.h:484
audio_output::events
const struct vlc_audio_output_events * events
Definition: vlc_aout.h:289
aout_FiltersDelete
#define aout_FiltersDelete(o, f)
Definition: vlc_aout.h:532
vlc_audio_output_events::device_report
void(* device_report)(audio_output_t *, const char *)
Definition: vlc_aout.h:129
vlc_audio_output_events::restart_request
void(* restart_request)(audio_output_t *, unsigned)
Definition: vlc_aout.h:131
vlc_object_t
VLC object common members.
Definition: vlc_objects.h:43
aout_VolumeSet
VLC_EXPORT int aout_VolumeSet(audio_output_t *, float)
Sets the volume of the audio output stream.
Definition: output.c:805
audio_output::drain
void(* drain)(audio_output_t *)
Drain the playback buffers (can be NULL).
Definition: vlc_aout.h:246
aout_MuteGet
VLC_EXPORT int aout_MuteGet(audio_output_t *)
Gets the audio output stream mute flag.
Definition: output.c:847
vlc_audio_output_events::policy_report
void(* policy_report)(audio_output_t *, bool)
Definition: vlc_aout.h:128
VLC_USED
#define VLC_USED
Definition: fourcc_gen.c:32
AOUT_CHANIDX_RIGHT
@ AOUT_CHANIDX_RIGHT
Definition: vlc_aout.h:296
vlc_block.h
name
const char name[16]
Definition: httpd.c:1268
vlc_audio_loudness::loudness_shortterm
double loudness_shortterm
Short term loudness (last 3seconds), in LUFS.
Definition: vlc_aout.h:561
pi_vlc_chan_order_wg4
static const uint32_t pi_vlc_chan_order_wg4[]
It describes the audio channel order VLC expect.
Definition: vlc_aout.h:324
aout_VolumeUpdate
VLC_EXPORT int aout_VolumeUpdate(audio_output_t *, int, float *)
Raises the volume.
Definition: output.c:821
vlc_audio_meter_cbs
Audio meter callback.
Definition: vlc_aout.h:575
aout_CheckChannelExtraction
VLC_EXPORT bool aout_CheckChannelExtraction(int *pi_selection, uint32_t *pi_layout, int *pi_channels, const uint32_t pi_order_dst[9], const uint32_t *pi_order_src, int i_channels)
This function will compute the extraction parameter into pi_selection to go from i_channels with thei...
Definition: common.c:463
aout_DevicesList
VLC_EXPORT int aout_DevicesList(audio_output_t *, char ***, char ***)
Enumerates possible audio output devices.
Definition: output.c:904
aout_FormatPrepare
VLC_EXPORT void aout_FormatPrepare(audio_sample_format_t *p_format)
Definition: common.c:87
aout_TimeGet
static int aout_TimeGet(audio_output_t *aout, vlc_tick_t *delay)
Definition: vlc_aout.h:542
audio_output::current_sink_info
struct audio_output::@183 current_sink_info
Current sink informations set by the module from the start() function.
audio_output::mute_set
int(* mute_set)(audio_output_t *, bool mute)
Changes muting (optinal, may be NULL).
Definition: vlc_aout.h:267
vlc_audio_loudness::loudness_momentary
double loudness_momentary
Momentary loudness (last 400 ms), in LUFS.
Definition: vlc_aout.h:559
vlc_audio_meter_plugin
Definition: meter.c:32
AOUT_CHANIDX_REARCENTER
@ AOUT_CHANIDX_REARCENTER
Definition: vlc_aout.h:301
vlc_audio_meter_plugin_owner::cbs
const struct vlc_audio_meter_cbs * cbs
Definition: vlc_aout.h:603
audio_output::time_get
int(* time_get)(audio_output_t *, vlc_tick_t *delay)
Estimates playback buffer latency (mandatory, cannot be NULL).
Definition: vlc_aout.h:180
aout_DeviceGet
VLC_EXPORT char * aout_DeviceGet(audio_output_t *)
Gets the currently selected device.
Definition: output.c:872
AOUT_CHANIDX_MIDDLERIGHT
@ AOUT_CHANIDX_MIDDLERIGHT
Definition: vlc_aout.h:298
AOUT_CHAN_REARLEFT
#define AOUT_CHAN_REARLEFT
Definition: vlc_es.h:121
aout_FiltersDrain
VLC_EXPORT block_t * aout_FiltersDrain(aout_filters_t *)
Definition: filters.c:749
audio_output::start
int(* start)(audio_output_t *, audio_sample_format_t *fmt)
Starts a new stream (mandatory, cannot be NULL).
Definition: vlc_aout.h:154
vlc_audio_meter_AddPlugin
VLC_EXPORT vlc_audio_meter_plugin * vlc_audio_meter_AddPlugin(struct vlc_audio_meter *meter, const char *chain, const struct vlc_audio_meter_plugin_owner *owner)
Add an "audio meter" plugin.
Definition: meter.c:88
vout_thread_t
Video output thread descriptor.
Definition: vlc_vout.h:55
vlc_audio_meter_Destroy
VLC_EXPORT void vlc_audio_meter_Destroy(struct vlc_audio_meter *meter)
Free allocated resource from the audio meter structure.
Definition: meter.c:54
aout_filters_cfg_t
Definition: vlc_aout.h:504
AOUT_CHANIDX_LEFT
@ AOUT_CHANIDX_LEFT
Definition: vlc_aout.h:295
audio_output::flush
void(* flush)(audio_output_t *)
Flushes the playback buffers (mandatory, cannot be NULL).
Definition: vlc_aout.h:238
vlc_popcount
#define vlc_popcount(x)
Bit weight / population count.
Definition: vlc_common.h:734
audio_output::sys
void * sys
Private data for callbacks.
Definition: vlc_aout.h:152
aout_CheckChannelReorder
VLC_EXPORT unsigned aout_CheckChannelReorder(const uint32_t *, const uint32_t *, uint32_t mask, uint8_t *table)
This function computes the reordering needed to go from pi_chan_order_in to pi_chan_order_out.
block_t
Definition: vlc_block.h:117
AOUT_CHANIDX_MAX
@ AOUT_CHANIDX_MAX
Definition: vlc_aout.h:304
aout_FormatPrint
#define aout_FormatPrint(o, t, f)
Definition: vlc_aout.h:393
vlc_audio_meter::plugins
struct vlc_list plugins
Definition: vlc_aout.h:620
vlc_audio_loudness
Audio loudness measurement.
Definition: vlc_aout.h:556
vlc_fourcc_t
uint32_t vlc_fourcc_t
Definition: fourcc_gen.c:33