VLC 4.0.0-dev
Loading...
Searching...
No Matches
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#include <vlc_es.h>
29#include <vlc_threads.h>
30
31/* FIXME to remove once aout.h is cleaned a bit more */
32#include <vlc_block.h>
33
34/**
35 * \defgroup audio_output Audio output
36 * \ingroup output
37 * @{
38 * \file
39 * Audio output modules interface
40 */
41
42/* Buffers which arrive in advance of more than AOUT_MAX_ADVANCE_TIME
43 * will be considered as bogus and be trashed */
44#define AOUT_MAX_ADVANCE_TIME (AOUT_MAX_PREPARE_TIME + VLC_TICK_FROM_SEC(1))
46/* Buffers which arrive in advance of more than AOUT_MAX_PREPARE_TIME
47 * will cause the calling thread to sleep */
48#define AOUT_MAX_PREPARE_TIME VLC_TICK_FROM_SEC(2)
50/* Buffers which arrive after pts - AOUT_MIN_PREPARE_TIME will be trashed
51 * to avoid too heavy resampling */
52#define AOUT_MIN_PREPARE_TIME AOUT_MAX_PTS_ADVANCE
54/* Tolerance values from EBU Recommendation 37 */
55/** Maximum advance of actual audio playback time to coded PTS,
56 * above which downsampling will be performed */
57#define AOUT_MAX_PTS_ADVANCE VLC_TICK_FROM_MS(40)
59/** Maximum delay of actual audio playback time from coded PTS,
60 * above which upsampling will be performed */
61#define AOUT_MAX_PTS_DELAY VLC_TICK_FROM_MS(60)
63/* Max acceptable resampling (in %) */
64#define AOUT_MAX_RESAMPLING 10
66#define AOUT_FMTS_IDENTICAL( p_first, p_second ) ( \
67 ((p_first)->i_format == (p_second)->i_format) \
68 && AOUT_FMTS_SIMILAR(p_first, p_second) )
69
70/* Check if i_rate == i_rate and i_channels == i_channels */
71#define AOUT_FMTS_SIMILAR( p_first, p_second ) ( \
72 ((p_first)->i_rate == (p_second)->i_rate) \
73 && ((p_first)->channel_type == (p_second)->channel_type) \
74 && ((p_first)->i_physical_channels == (p_second)->i_physical_channels)\
75 && ((p_first)->i_chan_mode == (p_second)->i_chan_mode) )
76
77#define AOUT_FMT_LINEAR( p_format ) \
78 (aout_BitsPerSample((p_format)->i_format) != 0)
79
80#define VLC_CODEC_SPDIFL VLC_FOURCC('s','p','d','i')
81#define VLC_CODEC_SPDIFB VLC_FOURCC('s','p','d','b')
83#define AOUT_FMT_SPDIF( p_format ) \
84 ( ((p_format)->i_format == VLC_CODEC_SPDIFL) \
85 || ((p_format)->i_format == VLC_CODEC_SPDIFB) \
86 || ((p_format)->i_format == VLC_CODEC_A52) \
87 || ((p_format)->i_format == VLC_CODEC_DTS) )
88
89#define AOUT_FMT_HDMI( p_format ) \
90 ( (p_format)->i_format == VLC_CODEC_EAC3 \
91 ||(p_format)->i_format == VLC_CODEC_DTSHD \
92 ||(p_format)->i_format == VLC_CODEC_TRUEHD \
93 ||(p_format)->i_format == VLC_CODEC_MLP \
94 )
95
96/* Values used for the audio-channels object variable */
97#define AOUT_VAR_CHAN_UNSET 0 /* must be zero */
98#define AOUT_VAR_CHAN_STEREO 1
99#define AOUT_VAR_CHAN_RSTEREO 2
100#define AOUT_VAR_CHAN_LEFT 3
101#define AOUT_VAR_CHAN_RIGHT 4
102#define AOUT_VAR_CHAN_DOLBYS 5
103/* deprecated: AOUT_VAR_CHAN_HEADPHONES 6, use AOUT_MIX_MODE_BINAURAL */
104#define AOUT_VAR_CHAN_MONO 7
106#define AOUT_MIX_MODE_UNSET 0
107#define AOUT_MIX_MODE_STEREO 1
108#define AOUT_MIX_MODE_BINAURAL 2
109#define AOUT_MIX_MODE_4_0 3
110#define AOUT_MIX_MODE_5_1 4
111#define AOUT_MIX_MODE_7_1 5
113/*****************************************************************************
114 * Main audio output structures
115 *****************************************************************************/
116
117/* Size of a frame for S/PDIF output. */
118#define AOUT_SPDIF_SIZE 6144
120/* Number of samples in an A/52 frame. */
121#define A52_FRAME_NB 1536
123/**
124 * \defgroup audio_output_module Audio output modules
125 * @{
126 */
127
129 void (*timing_report)(audio_output_t *, vlc_tick_t system_ts, vlc_tick_t audio_ts);
131 void (*volume_report)(audio_output_t *, float);
132 void (*mute_report)(audio_output_t *, bool);
134 void (*device_report)(audio_output_t *, const char *);
135 void (*hotplug_report)(audio_output_t *, const char *, const char *);
136 void (*restart_request)(audio_output_t *, unsigned);
137 int (*gain_request)(audio_output_t *, float);
139
140/** Audio output object
141 *
142 * The audio output object is the abstraction for rendering decoded
143 * (or pass-through) audio samples. In addition to playing samples,
144 * the abstraction exposes controls for pause/resume, flush/drain,
145 * changing the volume or mut flag, and listing and changing output device.
146 *
147 * An audio output can be in one of three different states:
148 * stopped, playing or paused.
149 * The audio output is always created in stopped state and is always destroyed
150 * in that state also. It is moved from stopped to playing state by start(),
151 * and from playing or paused states back to stopped state by stop().
152 **/
153struct audio_output
155 struct vlc_object_t obj;
157 void *sys; /**< Private data for callbacks */
159 int (*start)(audio_output_t *, audio_sample_format_t * restrict fmt);
160 /**< Starts a new stream (mandatory, cannot be NULL).
161 *
162 * This callback changes the audio output from stopped to playing state
163 * (if successful). After the callback returns, time_get(), play(),
164 * pause(), flush() and eventually stop() callbacks may be called.
165 *
166 * \param fmt input stream sample format upon entry,
167 * output stream sample format upon return [IN/OUT]
168 * \return VLC_SUCCESS on success, non-zero on failure
169 *
170 * \note This callback can only be called while the audio output is in
171 * stopped state. There can be only one stream per audio output at a time.
172 *
173 * \note This callbacks needs not be reentrant.
174 */
175
176 void (*stop)(audio_output_t *);
177 /**< Stops the existing stream (mandatory, cannot be NULL).
178 *
179 * This callback terminates the current audio stream,
180 * and returns the audio output to stopped state.
181 *
182 * \note This callback needs not be reentrant.
183 */
184
185 int (*time_get)(audio_output_t *, vlc_tick_t * restrict delay);
186 /**< Estimates playback buffer latency (can be NULL).
187 *
188 * This callback computes an estimation of the delay until the current
189 * tail of the audio output buffer would be rendered. This is essential
190 * for (lip) synchronization and long term drift between the audio output
191 * clock and the media upstream clock (if any).
192 *
193 * If the audio output clock is exactly synchronized with the system
194 * monotonic clock (i.e. vlc_tick_now()), then this callback is not
195 * mandatory. In that case, drain must be implemented (since the default
196 * implementation uses the delay to wait for the end of the stream).
197 *
198 * This callback is called before the first play() in order to get the
199 * initial delay (the hw latency). Most modules won't be able to know this
200 * latency before the first play. In that case, they should return -1 and
201 * handle the first play() date, cf. play() documentation.
202 *
203 * \warning It is recommended to report the audio delay via
204 * aout_TimingReport(). In that case, time_get should not be implemented.
205 *
206 * \param delay pointer to the delay until the next sample to be written
207 * to the playback buffer is rendered [OUT]
208 * \return 0 on success, non-zero on failure or lack of data
209 *
210 * \note This callback cannot be called in stopped state.
211 */
212
213 void (*play)(audio_output_t *, block_t *block, vlc_tick_t date);
214 /**< Queues a block of samples for playback (mandatory, cannot be NULL).
215 *
216 * The first play() date (after a flush()/start()) will be most likely in
217 * the future. Modules that don't know the hw latency before a first play
218 * (when they return -1 from the first time_get()) will need to handle
219 * this. They can play a silence buffer with 'length = date - now()', or
220 * configure their render callback to start at the given date.
221 *
222 * \param block block of audio samples
223 * \param date intended system time to render the first sample
224 *
225 * \note This callback cannot be called in stopped state.
226 */
227
228 void (*pause)( audio_output_t *, bool pause, vlc_tick_t date);
229 /**< Pauses or resumes playback (can be NULL).
230 *
231 * This callback pauses or resumes audio playback as quickly as possible.
232 * When pausing, it is desirable to stop producing sound immediately, but
233 * retain already queued audio samples in the buffer to play when later
234 * when resuming.
235 *
236 * If pausing is impossible, the core will flush the module.
237 *
238 * \param pause pause if true, resume from pause if false
239 * \param date timestamp when the pause or resume was requested
240 *
241 * \note This callback cannot be called in stopped state.
242 */
243
244 void (*flush)( audio_output_t *);
245 /**< Flushes the playback buffers (mandatory, cannot be NULL).
246 *
247 * \note This callback cannot be called in stopped state.
248 */
249
250 void (*drain)(audio_output_t *);
251 /**< Drain the playback buffers asynchronously (can be NULL).
252 *
253 * A drain operation can be cancelled by aout->flush() or aout->stop().
254 *
255 * It is legal to continue playback after a drain_async, if flush() is
256 * called before the next play().
257 *
258 * Call aout_DrainedReport() to notify that the stream is drained.
259 *
260 * If NULL, the caller will wait for the delay returned by time_get before
261 * calling stop().
262 */
263
264 int (*volume_set)(audio_output_t *, float volume);
265 /**< Changes playback volume (optional, may be NULL).
266 *
267 * \param volume requested volume (0. = mute, 1. = nominal)
268 *
269 * \note The volume is always a positive number.
270 *
271 * \warning A stream may or may not have been started when called.
272 * \warning This callback may be called concurrently with
273 * time_get(), play(), pause() or flush().
274 * It will however be protected against concurrent calls to
275 * start(), stop(), volume_set(), mute_set() or device_select().
276 */
277
278 int (*mute_set)(audio_output_t *, bool mute);
279 /**< Changes muting (optional, may be NULL).
280 *
281 * \param mute true to mute, false to unmute
282 * \warning The same constraints apply as with volume_set().
283 */
284
285 int (*device_select)(audio_output_t *, const char *id);
286 /**< Selects an audio output device (optional, may be NULL).
287 *
288 * \param id nul-terminated device unique identifier.
289 * \return 0 on success, non-zero on failure.
290 *
291 * \warning The same constraints apply as with volume_set().
292 */
293
294 struct {
295 bool headphones; /**< Default to false, set it to true if the current
296 sink is using headphones */
298 /**< Current sink information set by the module from the start() function */
300 const struct vlc_audio_output_events *events;
302
303/**
304 * Report a new timing point
305 *
306 * It is important to report the first point as soon as possible (and the
307 * following points if the audio delay take some time to be stabilized). Once
308 * the audio is stabilized, it is recommended to report timing points every
309 * seconds.
310 *
311 * This function can be called from the play() callback or from any threads
312 * after the first play(). This should not be called after a flush(), a stop(),
313 * a drain() or while paused. After a flush(), play() need to be called again
314 * before reporting a new timing. In that case, audio_ts should start again at
315 * 0 (for the first sample played).
316 *
317 * \param aout the audio output instance
318 * \param system_ts system timestamp when audio_ts is played, based on
319 * vlc_tick_now(), can be now, in the past or in the future.
320 * \param audio_ts audio timestamp played at system_ts, starts at 0 for the
321 * first sample played (must not take block->i_pts, passed in play(), into
322 * account).
323 *
324 */
325static inline void aout_TimingReport(audio_output_t *aout, vlc_tick_t system_ts,
326 vlc_tick_t audio_ts)
327{
328 aout->events->timing_report(aout, system_ts, audio_ts);
329}
330
331/**
332 * Report than the stream is drained (after a call to aout->drain_async)
333 */
334static inline void aout_DrainedReport(audio_output_t *aout)
336 aout->events->drained_report(aout);
337}
338
339/**
340 * Report change of configured audio volume to the core and UI.
341 */
342static inline void aout_VolumeReport(audio_output_t *aout, float volume)
344 aout->events->volume_report(aout, volume);
345}
346
347/**
348 * Report change of muted flag to the core and UI.
349 */
350static inline void aout_MuteReport(audio_output_t *aout, bool mute)
352 aout->events->mute_report(aout, mute);
353}
354
355/**
356 * Report audio policy status.
357 * \param aout the audio output instance reporting the cork policy
358 * \param cork true to request a cork, false to undo any pending cork.
359 */
360static inline void aout_PolicyReport(audio_output_t *aout, bool cork)
362 aout->events->policy_report(aout, cork);
363}
364
365/**
366 * Report change of output device.
367 */
368static inline void aout_DeviceReport(audio_output_t *aout, const char *id)
370 aout->events->device_report(aout, id);
371}
372
373/**
374 * Report a device hot-plug event.
375 * @param aout the audio output instance reporting the new device
376 * @param id device ID
377 * @param name human-readable device name (NULL for hot unplug)
378 */
379static inline void aout_HotplugReport(audio_output_t *aout,
380 const char *id, const char *name)
381{
382 aout->events->hotplug_report(aout, id, name);
383}
384
385/**
386 * Request a change of software audio amplification.
387 * \param aout the audio output instance requesting software gain
388 * \param gain linear amplitude gain (must be positive)
389 * \warning Values in excess 1.0 may cause overflow and distortion.
390 */
391static inline int aout_GainRequest(audio_output_t *aout, float gain)
393 return aout->events->gain_request(aout, gain);
394}
395
396static inline void aout_RestartRequest(audio_output_t *aout, unsigned mode)
398 aout->events->restart_request(aout, mode);
399}
400
401#define AOUT_RESTART_FILTERS 0x1
402#define AOUT_RESTART_OUTPUT (AOUT_RESTART_FILTERS|0x2)
403#define AOUT_RESTART_STEREOMODE (AOUT_RESTART_OUTPUT|0x4)
405/** @} */
406
407/**
408 * \defgroup audio_format Audio formats
409 * @{
410 */
411/**
412 * It describes the audio channel order VLC expect.
413 */
414static const uint32_t pi_vlc_chan_order_wg4[] =
422/**
423 * This function computes the reordering needed to go from pi_chan_order_in to
424 * pi_chan_order_out.
425 * If pi_chan_order_in or pi_chan_order_out is NULL, it will assume that vlc
426 * internal (WG4) order is requested.
427 */
428VLC_API unsigned aout_CheckChannelReorder( const uint32_t *, const uint32_t *,
429 uint32_t mask, uint8_t *table );
430
431/**
432 * Reorders audio samples within a block of linear audio interleaved samples.
433 * \param ptr start address of the block of samples
434 * \param bytes size of the block in bytes (must be a multiple of the product
435 * of the channels count and the sample size)
436 * \param channels channels count (also length of the chans_table table)
437 * \param chans_table permutation table to reorder the channels
438 * (usually computed by aout_CheckChannelReorder())
439 * \param fourcc sample format (must be a linear sample format)
440 * \note The samples must be naturally aligned in memory.
441 */
442VLC_API void aout_ChannelReorder(void *ptr, size_t bytes, uint8_t channels,
443 const uint8_t *chans_table,
444 vlc_fourcc_t fourcc);
445
446/**
447 * This function will compute the extraction parameter into pi_selection to go
448 * from i_channels with their type given by pi_order_src[] into the order
449 * describe by pi_order_dst.
450 * It will also set :
451 * - *pi_channels as the number of channels that will be extracted which is
452 * lower (in case of non understood channels type) or equal to i_channels.
453 * - the layout of the channels (*pi_layout).
454 *
455 * It will return true if channel extraction is really needed, in which case
456 * aout_ChannelExtract must be used
457 *
458 * XXX It must be used when the source may have channel type not understood
459 * by VLC. In this case the channel type pi_order_src[] must be set to 0.
460 * XXX It must also be used if multiple channels have the same type.
461 */
462VLC_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 );
463
464/**
465 * Do the actual channels extraction using the parameters created by
466 * aout_CheckChannelExtraction.
467 *
468 * XXX this function does not work in place (p_dst and p_src must not overlap).
469 * XXX Only 8, 16, 32, 64 bits per sample are supported.
470 */
471VLC_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 );
472
473VLC_API void aout_Interleave(void *dst, const void *const *planes,
474 unsigned samples, unsigned channels,
475 vlc_fourcc_t fourcc);
476VLC_API void aout_Deinterleave(void *dst, const void *src, unsigned samples,
477 unsigned channels, vlc_fourcc_t fourcc);
478
479/* */
480static inline unsigned aout_FormatNbChannels(const audio_sample_format_t *fmt)
483}
484
485VLC_API unsigned int aout_BitsPerSample( vlc_fourcc_t i_format ) VLC_USED;
487
488/**
489 * Prints an audio sample format in a human-readable form.
490 */
491VLC_API void aout_FormatPrint(vlc_object_t *, const char *,
492 const audio_sample_format_t *);
493#define aout_FormatPrint(o, t, f) aout_FormatPrint(VLC_OBJECT(o), t, f)
496
497/** @} */
498
499#define AOUT_VOLUME_DEFAULT 256
500#define AOUT_VOLUME_MAX 512
502/**
503 * Gets the volume of the audio output stream (independent of mute).
504 * \return Current audio volume (0. = silent, 1. = nominal),
505 * or a strictly negative value if undefined.
506 */
508
509/**
510 * Sets the volume of the audio output stream.
511 * \note The mute status is not changed.
512 * \return 0 on success, -1 on failure.
513 */
515
516/**
517 * Adjusts the volume.
518 * \param aout the audio output to update the volume for
519 * \param value how much to increase (> 0) or decrease (< 0) the volume
520 * \param volp if non-NULL, will contain contain the resulting volume
521 */
522VLC_API int aout_VolumeUpdate (audio_output_t *aout, int value,
523 float *volp);
524
525/**
526 * Gets the audio output stream mute flag.
527 * \return 0 if not muted, 1 if muted, -1 if undefined.
528 */
530
531/**
532 * Sets the audio output stream mute flag.
533 * \return 0 on success, -1 on failure.
534 */
536
537/**
538 * Gets the currently selected device.
539 * \return the selected device ID (caller must free() it)
540 * NULL if no device is selected or in case of error.
541 */
543
544/**
545 * Selects an audio output device.
546 * \param aout the audio output to set the device for
547 * \param id device ID to select, or NULL for the default device
548 * \return zero on success, non-zero on error.
549 */
550VLC_API int aout_DeviceSet (audio_output_t *aout, const char *id);
551
552/**
553 * Enumerates possible audio output devices.
554 *
555 * The function will heap-allocate two tables of heap-allocated strings;
556 * the caller is responsible for freeing all strings and both tables.
557 *
558 * \param aout the audio output to get the device list from
559 * \param ids pointer to a table of device identifiers [OUT]
560 * \param names pointer to a table of device human-readable descriptions [OUT]
561 * \return the number of devices, or negative on error.
562 * \note In case of error, *ids and *names are undefined.
563 */
564VLC_API int aout_DevicesList (audio_output_t *aout, char ***ids,
565 char ***names);
566
567/** @} */
568
569/**
570 * \defgroup audio_filters Audio filters
571 * \ingroup filters
572 * @{
573 */
574
575/**
576 * Enable or disable an audio filter ("audio-filter")
577 *
578 * \param aout a valid audio output
579 * \param name a valid filter name
580 * \param add true to add the filter, false to remove it
581 * \return 0 on success, non-zero on failure.
582 */
583VLC_API int aout_EnableFilter(audio_output_t *aout, const char *name, bool add);
584
585typedef enum
600static_assert(AOUT_CHANIDX_MAX == AOUT_CHAN_MAX, "channel count mismatch");
601
602#define AOUT_CHAN_REMAP_INIT { \
603 AOUT_CHANIDX_LEFT, \
604 AOUT_CHANIDX_RIGHT, \
605 AOUT_CHANIDX_MIDDLELEFT, \
606 AOUT_CHANIDX_MIDDLERIGHT, \
607 AOUT_CHANIDX_REARLEFT, \
608 AOUT_CHANIDX_REARRIGHT, \
609 AOUT_CHANIDX_REARCENTER, \
610 AOUT_CHANIDX_CENTER, \
611 AOUT_CHANIDX_LFE, \
612}
613
614typedef struct
616 /**
617 * If the remap order differs from the WG4 order, a remap audio filter will
618 * be inserted to remap channels according to this array.
619 */
620 int remap[AOUT_CHANIDX_MAX];
621 /**
622 * If true, a filter will be inserted to add a headphones effect (like a
623 * binauralizer audio filter).
624 */
625 bool headphones;
627
628#define AOUT_FILTERS_CFG_INIT (aout_filters_cfg_t) \
629 { .remap = AOUT_CHAN_REMAP_INIT, \
630 .headphones = false, \
631 };
632
633typedef struct aout_filters aout_filters_t;
637 const audio_sample_format_t *,
638 const aout_filters_cfg_t *cfg) VLC_USED;
639#define aout_FiltersNew(o,inf,outf,remap) \
640 aout_FiltersNew(VLC_OBJECT(o),inf,outf,remap)
642#define aout_FiltersDelete(o,f) \
643 aout_FiltersDelete(VLC_OBJECT(o),f)
649
650/**
651 * Create a vout from an "visualization" audio filter.
652 *
653 * @warning Can only be called once, from the probe function (Open).
654 *
655 * @return a valid vout or NULL in case of error, the returned vout should not
656 * be freed via vout_Close().
657 */
659
660/** @} */
661
662/**
663 * @defgroup audio_output_meter Audio meter API
664 * \ingroup audio_output
665 * @{
666 */
667
668/**
669 * Audio loudness measurement
670 */
673 /** Momentary loudness (last 400 ms), in LUFS */
674 double loudness_momentary;
675 /** Short term loudness (last 3seconds), in LUFS */
676 double loudness_shortterm;
677 /** Integrated loudness (global), in LUFS */
678 double loudness_integrated;
679 /** Loudness range, in LU */
680 double loudness_range;
681 /** True Peak, in dBTP */
682 double truepeak;
684
685/**
686 * Audio meter callback
687 *
688 * Triggered from vlc_audio_meter_Process() and vlc_audio_meter_Flush().
689 */
692 /**
693 * Called when new loudness measurements are available
694 *
695 * @param date absolute date (likely in the future) of this measurement
696 * @param loudness pointer to the loudness measurement
697 * @param opaque pointer set by vlc_audio_meter_AddPlugin().
698 */
699 void (*on_loudness)(vlc_tick_t date, const struct vlc_audio_loudness *loudness, void *data);
701
702/**
703 * Audio meter plugin opaque structure
704 *
705 * This opaque structure is returned by vlc_audio_meter_AddPlugin().
706 */
709/**
710 * Audio meter plugin owner structure
711 *
712 * Used to setup callbacks and private data
713 *
714 * Can be registered with vlc_audio_meter_AddPlugin().
715 */
718 const struct vlc_audio_meter_cbs *cbs;
719 void *sys;
721
722/**
723 * Audio meter structure
724 *
725 * Initialise with vlc_audio_meter_Init()
726 *
727 * @warning variables of this struct should not be used directly
728 */
729struct vlc_audio_meter
738/**
739 * Initialize the audio meter structure
740 *
741 * @param meter allocated audio meter structure
742 * @param parent object that will be used to create audio filters
743 */
744VLC_API void
746#define vlc_audio_meter_Init(a,b) vlc_audio_meter_Init(a, VLC_OBJECT(b))
748/**
749 * Free allocated resource from the audio meter structure
750 *
751 * @param meter allocated audio meter structure
752 */
753VLC_API void
755
756/**
757 * Set or reset the audio format
758 *
759 * This will reload all plugins added with vlc_audio_meter_AddPlugin()
760 *
761 * @param meter audio meter structure
762 * @param fmt NULL to unload all plugins or a valid pointer to an audio format,
763 * must stay valid during the lifetime of the audio meter (until
764 * vlc_audio_meter_Reset() or vlc_audio_meter_Destroy() are called)
765 *
766 * @return VLC_SUCCESS on success, VLC_EGENERIC if a plugin failed to load
767 */
768VLC_API int
770
771/**
772 * Add an "audio meter" plugin
773 *
774 * The module to be loaded if meter->fmt is valid, otherwise, the module
775 * will be loaded from a next call to vlc_audio_meter_Reset()
776 *
777 * @param meter audio meter structure
778 * @param chain name of the module, can contain specific module options using
779 * the following chain convention:"name{option1=a,option2=b}"
780 * @param owner pointer to a vlc_audio_meter_plugin_owner structure, the
781 * structure must stay valid during the lifetime of the plugin
782 * @return a valid audio meter plugin, or NULL in case of error
783 */
785vlc_audio_meter_AddPlugin(struct vlc_audio_meter *meter, const char *chain,
786 const struct vlc_audio_meter_plugin_owner *owner);
787
788/**
789 * Remove an "audio meter" plugin
790 *
791 * @param meter audio meter structure
792 * @param plugin plugin returned by vlc_audio_meter_AddPlugin()
793 */
794VLC_API void
796
797/**
798 * Process an audio block
799 *
800 * vlc_audio_meter_events callbacks can be triggered from this function.
801 *
802 * @param meter audio meter structure
803 * @param block pointer to a block, this block won't be released of modified
804 * from this function
805 * @param date absolute date (likely in the future) when this block should be rendered
806 */
807VLC_API void
808vlc_audio_meter_Process(struct vlc_audio_meter *meter, block_t *block, vlc_tick_t date);
809
810/**
811 * Flush all "audio meter" plugins
812 *
813 * vlc_audio_meter_events callbacks can be triggered from this function.
814 *
815 * @param meter audio meter structure
816 */
817VLC_API void
819
820/** @} */
821
822#endif /* VLC_AOUT_H */
#define VLC_USED
Definition fourcc_gen.c:32
#define VLC_API
Definition fourcc_gen.c:31
uint32_t vlc_fourcc_t
Definition fourcc_gen.c:33
vout_thread_t * aout_filter_GetVout(filter_t *, const video_format_t *)
Create a vout from an "visualization" audio filter.
Definition filters.c:414
block_t * aout_FiltersPlay(aout_filters_t *, block_t *, float rate)
Definition filters.c:789
int aout_EnableFilter(audio_output_t *aout, const char *name, bool add)
Enable or disable an audio filter ("audio-filter")
Definition common.c:525
vlc_chan_order_idx_t
Definition vlc_aout.h:587
bool aout_FiltersAdjustResampling(aout_filters_t *, int)
Definition filters.c:777
#define aout_FiltersDelete(o, f)
Definition vlc_aout.h:643
block_t * aout_FiltersDrain(aout_filters_t *)
Definition filters.c:826
#define aout_FiltersNew(o, inf, outf, remap)
Definition vlc_aout.h:640
void aout_FiltersChangeViewpoint(aout_filters_t *, const vlc_viewpoint_t *vp)
Definition filters.c:866
void aout_FiltersFlush(aout_filters_t *)
Definition filters.c:858
@ AOUT_CHANIDX_MAX
Definition vlc_aout.h:598
@ AOUT_CHANIDX_CENTER
Definition vlc_aout.h:596
@ AOUT_CHANIDX_MIDDLELEFT
Definition vlc_aout.h:591
@ AOUT_CHANIDX_DISABLE
Definition vlc_aout.h:588
@ AOUT_CHANIDX_MIDDLERIGHT
Definition vlc_aout.h:592
@ AOUT_CHANIDX_RIGHT
Definition vlc_aout.h:590
@ AOUT_CHANIDX_LFE
Definition vlc_aout.h:597
@ AOUT_CHANIDX_LEFT
Definition vlc_aout.h:589
@ AOUT_CHANIDX_REARLEFT
Definition vlc_aout.h:593
@ AOUT_CHANIDX_REARRIGHT
Definition vlc_aout.h:594
@ AOUT_CHANIDX_REARCENTER
Definition vlc_aout.h:595
void aout_Deinterleave(void *dst, const void *src, unsigned samples, unsigned channels, vlc_fourcc_t fourcc)
void aout_Interleave(void *dst, const void *const *planes, unsigned samples, unsigned channels, vlc_fourcc_t fourcc)
unsigned int aout_BitsPerSample(vlc_fourcc_t i_format)
Definition common.c:41
void aout_FormatPrepare(audio_sample_format_t *p_format)
Definition common.c:87
void aout_ChannelReorder(void *ptr, size_t bytes, uint8_t channels, const uint8_t *chans_table, vlc_fourcc_t fourcc)
Reorders audio samples within a block of linear audio interleaved samples.
static unsigned aout_FormatNbChannels(const audio_sample_format_t *fmt)
Definition vlc_aout.h:481
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:431
const char * aout_FormatPrintChannels(const audio_sample_format_t *)
Definition common.c:105
static const uint32_t pi_vlc_chan_order_wg4[]
It describes the audio channel order VLC expect.
Definition vlc_aout.h:415
#define aout_FormatPrint(o, t, f)
Definition vlc_aout.h:494
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.
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:449
void vlc_audio_meter_Process(struct vlc_audio_meter *meter, block_t *block, vlc_tick_t date)
Process an audio block.
Definition meter.c:194
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:156
void vlc_audio_meter_RemovePlugin(struct vlc_audio_meter *meter, vlc_audio_meter_plugin *plugin)
Remove an "audio meter" plugin.
Definition meter.c:134
#define vlc_audio_meter_Init(a, b)
Definition vlc_aout.h:747
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:89
void vlc_audio_meter_Flush(struct vlc_audio_meter *meter)
Flush all "audio meter" plugins.
Definition meter.c:216
void vlc_audio_meter_Destroy(struct vlc_audio_meter *meter)
Free allocated resource from the audio meter structure.
Definition meter.c:55
static void aout_RestartRequest(audio_output_t *aout, unsigned mode)
Definition vlc_aout.h:397
static void aout_DrainedReport(audio_output_t *aout)
Report than the stream is drained (after a call to aout->drain_async)
Definition vlc_aout.h:335
static void aout_MuteReport(audio_output_t *aout, bool mute)
Report change of muted flag to the core and UI.
Definition vlc_aout.h:351
static void aout_TimingReport(audio_output_t *aout, vlc_tick_t system_ts, vlc_tick_t audio_ts)
Report a new timing point.
Definition vlc_aout.h:326
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:343
static void aout_HotplugReport(audio_output_t *aout, const char *id, const char *name)
Report a device hot-plug event.
Definition vlc_aout.h:380
static int aout_GainRequest(audio_output_t *aout, float gain)
Request a change of software audio amplification.
Definition vlc_aout.h:392
static void aout_DeviceReport(audio_output_t *aout, const char *id)
Report change of output device.
Definition vlc_aout.h:369
static void aout_PolicyReport(audio_output_t *aout, bool cork)
Report audio policy status.
Definition vlc_aout.h:361
int aout_VolumeUpdate(audio_output_t *aout, int value, float *volp)
Adjusts the volume.
Definition output.c:840
int aout_DeviceSet(audio_output_t *aout, const char *id)
Selects an audio output device.
Definition output.c:880
int aout_VolumeSet(audio_output_t *, float)
Sets the volume of the audio output stream.
Definition output.c:829
int aout_MuteGet(audio_output_t *)
Gets the audio output stream mute flag.
Definition output.c:859
float aout_VolumeGet(audio_output_t *)
Gets the volume of the audio output stream (independent of mute).
Definition output.c:824
int aout_DevicesList(audio_output_t *aout, char ***ids, char ***names)
Enumerates possible audio output devices.
Definition output.c:891
int aout_MuteSet(audio_output_t *, bool)
Sets the audio output stream mute flag.
Definition output.c:864
char * aout_DeviceGet(audio_output_t *)
Gets the currently selected device.
Definition output.c:875
#define vlc_popcount(x)
Bit weight / population count.
Definition vlc_common.h:674
const char name[16]
Definition httpd.c:1298
Definition vlc_aout.h:616
bool headphones
If true, a filter will be inserted to add a headphones effect (like a binauralizer audio filter).
Definition vlc_aout.h:626
Definition filters.c:368
audio format description
Definition vlc_es.h:83
uint16_t i_physical_channels
Definition vlc_es.h:89
Audio output object.
Definition vlc_aout.h:155
void(* flush)(audio_output_t *)
Flushes the playback buffers (mandatory, cannot be NULL).
Definition vlc_aout.h:245
bool headphones
Default to false, set it to true if the current sink is using headphones.
Definition vlc_aout.h:296
int(* volume_set)(audio_output_t *, float volume)
Changes playback volume (optional, may be NULL).
Definition vlc_aout.h:265
void(* pause)(audio_output_t *, bool pause, vlc_tick_t date)
Pauses or resumes playback (can be NULL).
Definition vlc_aout.h:229
int(* start)(audio_output_t *, audio_sample_format_t *restrict fmt)
Starts a new stream (mandatory, cannot be NULL).
Definition vlc_aout.h:160
struct audio_output::@190 current_sink_info
Current sink information set by the module from the start() function.
int(* device_select)(audio_output_t *, const char *id)
Selects an audio output device (optional, may be NULL).
Definition vlc_aout.h:286
int(* mute_set)(audio_output_t *, bool mute)
Changes muting (optional, may be NULL).
Definition vlc_aout.h:279
struct vlc_object_t obj
Definition vlc_aout.h:156
void(* stop)(audio_output_t *)
Stops the existing stream (mandatory, cannot be NULL).
Definition vlc_aout.h:177
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:214
void(* drain)(audio_output_t *)
Drain the playback buffers asynchronously (can be NULL).
Definition vlc_aout.h:251
const struct vlc_audio_output_events * events
Definition vlc_aout.h:301
void * sys
Private data for callbacks.
Definition vlc_aout.h:158
int(* time_get)(audio_output_t *, vlc_tick_t *restrict delay)
Estimates playback buffer latency (can be NULL).
Definition vlc_aout.h:186
Structure describing a filter.
Definition vlc_filter.h:219
video format description
Definition vlc_es.h:356
Audio loudness measurement.
Definition vlc_aout.h:673
double loudness_shortterm
Short term loudness (last 3seconds), in LUFS.
Definition vlc_aout.h:677
double loudness_momentary
Momentary loudness (last 400 ms), in LUFS.
Definition vlc_aout.h:675
double truepeak
True Peak, in dBTP.
Definition vlc_aout.h:683
double loudness_integrated
Integrated loudness (global), in LUFS.
Definition vlc_aout.h:679
double loudness_range
Loudness range, in LU.
Definition vlc_aout.h:681
Audio meter callback.
Definition vlc_aout.h:692
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:700
Audio meter plugin owner structure.
Definition vlc_aout.h:718
const struct vlc_audio_meter_cbs * cbs
Definition vlc_aout.h:719
void * sys
Definition vlc_aout.h:720
Definition meter.c:34
Audio meter structure.
Definition vlc_aout.h:731
vlc_object_t * parent
Definition vlc_aout.h:733
const audio_sample_format_t * fmt
Definition vlc_aout.h:734
struct vlc_list plugins
Definition vlc_aout.h:736
vlc_mutex_t lock
Definition vlc_aout.h:732
Definition vlc_aout.h:129
void(* policy_report)(audio_output_t *, bool)
Definition vlc_aout.h:134
int(* gain_request)(audio_output_t *, float)
Definition vlc_aout.h:138
void(* drained_report)(audio_output_t *)
Definition vlc_aout.h:131
void(* mute_report)(audio_output_t *, bool)
Definition vlc_aout.h:133
void(* device_report)(audio_output_t *, const char *)
Definition vlc_aout.h:135
void(* timing_report)(audio_output_t *, vlc_tick_t system_ts, vlc_tick_t audio_ts)
Definition vlc_aout.h:130
void(* hotplug_report)(audio_output_t *, const char *, const char *)
Definition vlc_aout.h:136
void(* restart_request)(audio_output_t *, unsigned)
Definition vlc_aout.h:137
void(* volume_report)(audio_output_t *, float)
Definition vlc_aout.h:132
Definition vlc_frame.h:123
Doubly-linked list node.
Definition vlc_list.h:44
Mutex.
Definition vlc_threads.h:143
VLC object common members.
Definition vlc_objects.h:53
Viewpoints.
Definition vlc_viewpoint.h:41
Video output thread descriptor.
Definition vlc_vout.h:54
This file is a collection of common definitions and types.
This file defines the elementary streams format types.
#define AOUT_CHAN_LFE
Definition vlc_es.h:126
#define AOUT_CHAN_REARCENTER
Definition vlc_es.h:121
#define AOUT_CHAN_REARLEFT
Definition vlc_es.h:122
#define AOUT_CHAN_MIDDLELEFT
Definition vlc_es.h:124
#define AOUT_CHAN_MIDDLERIGHT
Definition vlc_es.h:125
#define AOUT_CHAN_REARRIGHT
Definition vlc_es.h:123
#define AOUT_CHAN_MAX
Definition vlc_es.h:154
#define AOUT_CHAN_RIGHT
Definition vlc_es.h:120
#define AOUT_CHAN_CENTER
Definition vlc_es.h:118
#define AOUT_CHAN_LEFT
Definition vlc_es.h:119
This provides convenience helpers for linked lists.
Thread primitive declarations.
int64_t vlc_tick_t
High precision date or time interval.
Definition vlc_tick.h:48