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 
28 /**
29  * \defgroup audio_output Audio output
30  * \ingroup output
31  * @{
32  * \file
33  * Audio output modules interface
34  */
35 
36 /* Buffers which arrive in advance of more than AOUT_MAX_ADVANCE_TIME
37  * will be considered as bogus and be trashed */
38 #define AOUT_MAX_ADVANCE_TIME (AOUT_MAX_PREPARE_TIME + VLC_TICK_FROM_SEC(1))
39 
40 /* Buffers which arrive in advance of more than AOUT_MAX_PREPARE_TIME
41  * will cause the calling thread to sleep */
42 #define AOUT_MAX_PREPARE_TIME VLC_TICK_FROM_SEC(2)
43 
44 /* Buffers which arrive after pts - AOUT_MIN_PREPARE_TIME will be trashed
45  * to avoid too heavy resampling */
46 #define AOUT_MIN_PREPARE_TIME AOUT_MAX_PTS_ADVANCE
47 
48 /* Tolerance values from EBU Recommendation 37 */
49 /** Maximum advance of actual audio playback time to coded PTS,
50  * above which downsampling will be performed */
51 #define AOUT_MAX_PTS_ADVANCE VLC_TICK_FROM_MS(40)
52 
53 /** Maximum delay of actual audio playback time from coded PTS,
54  * above which upsampling will be performed */
55 #define AOUT_MAX_PTS_DELAY VLC_TICK_FROM_MS(60)
56 
57 /* Max acceptable resampling (in %) */
58 #define AOUT_MAX_RESAMPLING 10
59 
60 #include "vlc_es.h"
61 
62 #define AOUT_FMTS_IDENTICAL( p_first, p_second ) ( \
63  ((p_first)->i_format == (p_second)->i_format) \
64  && AOUT_FMTS_SIMILAR(p_first, p_second) )
65 
66 /* Check if i_rate == i_rate and i_channels == i_channels */
67 #define AOUT_FMTS_SIMILAR( p_first, p_second ) ( \
68  ((p_first)->i_rate == (p_second)->i_rate) \
69  && ((p_first)->channel_type == (p_second)->channel_type) \
70  && ((p_first)->i_physical_channels == (p_second)->i_physical_channels)\
71  && ((p_first)->i_chan_mode == (p_second)->i_chan_mode) )
72 
73 #define AOUT_FMT_LINEAR( p_format ) \
74  (aout_BitsPerSample((p_format)->i_format) != 0)
75 
76 #define VLC_CODEC_SPDIFL VLC_FOURCC('s','p','d','i')
77 #define VLC_CODEC_SPDIFB VLC_FOURCC('s','p','d','b')
78 
79 #define AOUT_FMT_SPDIF( p_format ) \
80  ( ((p_format)->i_format == VLC_CODEC_SPDIFL) \
81  || ((p_format)->i_format == VLC_CODEC_SPDIFB) \
82  || ((p_format)->i_format == VLC_CODEC_A52) \
83  || ((p_format)->i_format == VLC_CODEC_DTS) )
84 
85 #define AOUT_FMT_HDMI( p_format ) \
86  ( (p_format)->i_format == VLC_CODEC_EAC3 \
87  ||(p_format)->i_format == VLC_CODEC_DTSHD \
88  ||(p_format)->i_format == VLC_CODEC_TRUEHD \
89  ||(p_format)->i_format == VLC_CODEC_MLP \
90  )
91 
92 /* Values used for the audio-channels object variable */
93 #define AOUT_VAR_CHAN_UNSET 0 /* must be zero */
94 #define AOUT_VAR_CHAN_STEREO 1
95 #define AOUT_VAR_CHAN_RSTEREO 2
96 #define AOUT_VAR_CHAN_LEFT 3
97 #define AOUT_VAR_CHAN_RIGHT 4
98 #define AOUT_VAR_CHAN_DOLBYS 5
99 #define AOUT_VAR_CHAN_HEADPHONES 6
100 #define AOUT_VAR_CHAN_MONO 7
102 /*****************************************************************************
103  * Main audio output structures
104  *****************************************************************************/
105 
106 /* Size of a frame for S/PDIF output. */
107 #define AOUT_SPDIF_SIZE 6144
109 /* Number of samples in an A/52 frame. */
110 #define A52_FRAME_NB 1536
112 /* FIXME to remove once aout.h is cleaned a bit more */
113 #include <vlc_block.h>
114 
116  void (*timing_report)(audio_output_t *, vlc_tick_t system_now, vlc_tick_t pts);
117  void (*volume_report)(audio_output_t *, float);
118  void (*mute_report)(audio_output_t *, bool);
119  void (*policy_report)(audio_output_t *, bool);
120  void (*device_report)(audio_output_t *, const char *);
121  void (*hotplug_report)(audio_output_t *, const char *, const char *);
122  void (*restart_request)(audio_output_t *, unsigned);
123  int (*gain_request)(audio_output_t *, float);
124 };
125 
126 /** Audio output object
127  *
128  * The audio output object is the abstraction for rendering decoded
129  * (or pass-through) audio samples. In addition to playing samples,
130  * the abstraction exposes controls for pause/resume, flush/drain,
131  * changing the volume or mut flag, and listing and changing output device.
132  *
133  * An audio output can be in one of three different states:
134  * stopped, playing or paused.
135  * The audio output is always created in stopped state and is always destroyed
136  * in that state also. It is moved from stopped to playing state by start(),
137  * and from playing or paused states back to stopped state by stop().
138  **/
139 struct audio_output
140 {
141  struct vlc_object_t obj;
143  void *sys; /**< Private data for callbacks */
145  int (*start)(audio_output_t *, audio_sample_format_t *fmt);
146  /**< Starts a new stream (mandatory, cannot be NULL).
147  *
148  * This callback changes the audio output from stopped to playing state
149  * (if succesful). After the callback returns, time_get(), play(),
150  * pause(), flush() and eventually stop() callbacks may be called.
151  *
152  * \param fmt input stream sample format upon entry,
153  * output stream sample format upon return [IN/OUT]
154  * \return VLC_SUCCESS on success, non-zero on failure
155  *
156  * \note This callback can only be called while the audio output is in
157  * stopped state. There can be only one stream per audio output at a time.
158  *
159  * \note This callbacks needs not be reentrant.
160  */
161 
162  void (*stop)(audio_output_t *);
163  /**< Stops the existing stream (mandatory, cannot be NULL).
164  *
165  * This callback terminates the current audio stream,
166  * and returns the audio output to stopped state.
167  *
168  * \note This callback needs not be reentrant.
169  */
170 
171  int (*time_get)(audio_output_t *, vlc_tick_t *delay);
172  /**< Estimates playback buffer latency (mandatory, cannot be NULL).
173  *
174  * This callback computes an estimation of the delay until the current
175  * tail of the audio output buffer would be rendered. This is essential
176  * for (lip) synchronization and long term drift between the audio output
177  * clock and the media upstream clock (if any).
178  *
179  * If the audio output clock is exactly synchronized with the system
180  * monotonic clock (i.e. vlc_tick_now()), then aout_TimeGetDefault() can
181  * implement this callback. In that case, drain must be implemented (since
182  * the default implementation uses the delay to wait for the end of the
183  * stream).
184  *
185  * This callback is called before the first play() in order to get the
186  * initial delay (the hw latency). Most modules won't be able to know this
187  * latency before the first play. In that case, they should return -1 and
188  * handle the first play() date, cf. play() documentation.
189  *
190  * \param delay pointer to the delay until the next sample to be written
191  * to the playback buffer is rendered [OUT]
192  * \return 0 on success, non-zero on failure or lack of data
193  *
194  * \note This callback cannot be called in stopped state.
195  */
196 
197  void (*play)(audio_output_t *, block_t *block, vlc_tick_t date);
198  /**< Queues a block of samples for playback (mandatory, cannot be NULL).
199  *
200  * The first play() date (after a flush()/start()) will be most likely in
201  * the future. Modules that don't know the hw latency before a first play
202  * (when they return -1 from the first time_get()) will need to handle
203  * this. They can play a silence buffer with 'length = date - now()', or
204  * configure their render callback to start at the given date.
205  *
206  * \param block block of audio samples
207  * \param date intended system time to render the first sample
208  *
209  * \note This callback cannot be called in stopped state.
210  */
211 
212  void (*pause)( audio_output_t *, bool pause, vlc_tick_t date);
213  /**< Pauses or resumes playback (mandatory, cannot be NULL).
214  *
215  * This callback pauses or resumes audio playback as quickly as possible.
216  * When pausing, it is desirable to stop producing sound immediately, but
217  * retain already queued audio samples in the buffer to play when later
218  * when resuming.
219  *
220  * If pausing is impossible, then aout_PauseDefault() can provide a
221  * fallback implementation of this callback.
222  *
223  * \param pause pause if true, resume from pause if false
224  * \param date timestamp when the pause or resume was requested
225  *
226  * \note This callback cannot be called in stopped state.
227  */
228 
229  void (*flush)( audio_output_t *);
230  /**< Flushes the playback buffers (mandatory, cannot be NULL).
231  *
232  * \param wait true to wait for playback of pending buffers (drain),
233  * false to discard pending buffers (flush)
234  *
235  * \note This callback cannot be called in stopped state.
236  */
237  void (*drain)(audio_output_t *);
238  /**< Drain the playback buffers (can be NULL).
239  *
240  * If NULL, the caller will wait for the delay returned by time_get before
241  * calling stop().
242  */
243 
244  int (*volume_set)(audio_output_t *, float volume);
245  /**< Changes playback volume (optional, may be NULL).
246  *
247  * \param volume requested volume (0. = mute, 1. = nominal)
248  *
249  * \note The volume is always a positive number.
250  *
251  * \warning A stream may or may not have been started when called.
252  * \warning This callback may be called concurrently with
253  * time_get(), play(), pause() or flush().
254  * It will however be protected against concurrent calls to
255  * start(), stop(), volume_set(), mute_set() or device_select().
256  */
257 
258  int (*mute_set)(audio_output_t *, bool mute);
259  /**< Changes muting (optinal, may be NULL).
260  *
261  * \param mute true to mute, false to unmute
262  * \warning The same constraints apply as with volume_set().
263  */
264 
265  int (*device_select)(audio_output_t *, const char *id);
266  /**< Selects an audio output device (optional, may be NULL).
267  *
268  * \param id nul-terminated device unique identifier.
269  * \return 0 on success, non-zero on failure.
270  *
271  * \warning The same constraints apply as with volume_set().
272  */
273 
274  struct {
275  bool headphones; /**< Default to false, set it to true if the current
276  sink is using headphones */
277  } current_sink_info;
278  /**< Current sink informations set by the module from the start() function */
279 
280  const struct vlc_audio_output_events *events;
281 };
282 
283 typedef enum
284 {
297 
298 static_assert(AOUT_CHANIDX_MAX == AOUT_CHAN_MAX, "channel count mismatch");
299 
300 #define AOUT_CHAN_REMAP_INIT { \
301  AOUT_CHANIDX_LEFT, \
302  AOUT_CHANIDX_RIGHT, \
303  AOUT_CHANIDX_MIDDLELEFT, \
304  AOUT_CHANIDX_MIDDLERIGHT, \
305  AOUT_CHANIDX_REARLEFT, \
306  AOUT_CHANIDX_REARRIGHT, \
307  AOUT_CHANIDX_REARCENTER, \
308  AOUT_CHANIDX_CENTER, \
309  AOUT_CHANIDX_LFE, \
310 }
311 
312 /**
313  * It describes the audio channel order VLC expect.
314  */
315 static const uint32_t pi_vlc_chan_order_wg4[] =
316 {
321 };
322 
323 #define AOUT_RESTART_FILTERS 0x1
324 #define AOUT_RESTART_OUTPUT (AOUT_RESTART_FILTERS|0x2)
325 #define AOUT_RESTART_STEREOMODE (AOUT_RESTART_OUTPUT|0x4)
327 /*****************************************************************************
328  * Prototypes
329  *****************************************************************************/
330 
331 /**
332  * This function computes the reordering needed to go from pi_chan_order_in to
333  * pi_chan_order_out.
334  * If pi_chan_order_in or pi_chan_order_out is NULL, it will assume that vlc
335  * internal (WG4) order is requested.
336  */
337 VLC_API unsigned aout_CheckChannelReorder( const uint32_t *, const uint32_t *,
338  uint32_t mask, uint8_t *table );
339 VLC_API void aout_ChannelReorder(void *, size_t, uint8_t, const uint8_t *, vlc_fourcc_t);
340 
341 VLC_API void aout_Interleave(void *dst, const void *const *planes,
342  unsigned samples, unsigned channels,
343  vlc_fourcc_t fourcc);
344 VLC_API void aout_Deinterleave(void *dst, const void *src, unsigned samples,
345  unsigned channels, vlc_fourcc_t fourcc);
346 
347 /**
348  * This function will compute the extraction parameter into pi_selection to go
349  * from i_channels with their type given by pi_order_src[] into the order
350  * describe by pi_order_dst.
351  * It will also set :
352  * - *pi_channels as the number of channels that will be extracted which is
353  * lower (in case of non understood channels type) or equal to i_channels.
354  * - the layout of the channels (*pi_layout).
355  *
356  * It will return true if channel extraction is really needed, in which case
357  * aout_ChannelExtract must be used
358  *
359  * XXX It must be used when the source may have channel type not understood
360  * by VLC. In this case the channel type pi_order_src[] must be set to 0.
361  * XXX It must also be used if multiple channels have the same type.
362  */
363 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 );
364 
365 /**
366  * Do the actual channels extraction using the parameters created by
367  * aout_CheckChannelExtraction.
368  *
369  * XXX this function does not work in place (p_dst and p_src must not overlap).
370  * XXX Only 8, 16, 32, 64 bits per sample are supported.
371  */
372 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 );
373 
374 /* */
375 static inline unsigned aout_FormatNbChannels(const audio_sample_format_t *fmt)
376 {
377  return vlc_popcount(fmt->i_physical_channels);
378 }
379 
380 VLC_API unsigned int aout_BitsPerSample( vlc_fourcc_t i_format ) VLC_USED;
382 VLC_API void aout_FormatPrint(vlc_object_t *, const char *,
383  const audio_sample_format_t *);
384 #define aout_FormatPrint(o, t, f) aout_FormatPrint(VLC_OBJECT(o), t, f)
386 
387 #define AOUT_VOLUME_DEFAULT 256
388 #define AOUT_VOLUME_MAX 512
391 VLC_API int aout_VolumeSet (audio_output_t *, float);
392 VLC_API int aout_VolumeUpdate (audio_output_t *, int, float *);
394 VLC_API int aout_MuteSet (audio_output_t *, bool);
396 VLC_API int aout_DeviceSet (audio_output_t *, const char *);
397 VLC_API int aout_DevicesList (audio_output_t *, char ***, char ***);
398 
399 /**
400  * Report change of configured audio volume to the core and UI.
401  */
402 static inline void aout_VolumeReport(audio_output_t *aout, float volume)
403 {
404  aout->events->volume_report(aout, volume);
405 }
406 
407 /**
408  * Report change of muted flag to the core and UI.
409  */
410 static inline void aout_MuteReport(audio_output_t *aout, bool mute)
411 {
412  aout->events->mute_report(aout, mute);
413 }
414 
415 /**
416  * Report audio policy status.
417  * \param cork true to request a cork, false to undo any pending cork.
418  */
419 static inline void aout_PolicyReport(audio_output_t *aout, bool cork)
420 {
421  aout->events->policy_report(aout, cork);
422 }
423 
424 /**
425  * Report change of output device.
426  */
427 static inline void aout_DeviceReport(audio_output_t *aout, const char *id)
428 {
429  aout->events->device_report(aout, id);
430 }
431 
432 /**
433  * Report a device hot-plug event.
434  * @param id device ID
435  * @param name human-readable device name (NULL for hot unplug)
436  */
437 static inline void aout_HotplugReport(audio_output_t *aout,
438  const char *id, const char *name)
439 {
440  aout->events->hotplug_report(aout, id, name);
441 }
442 
443 /**
444  * Request a change of software audio amplification.
445  * \param gain linear amplitude gain (must be positive)
446  * \warning Values in excess 1.0 may cause overflow and distorsion.
447  */
448 static inline int aout_GainRequest(audio_output_t *aout, float gain)
449 {
450  return aout->events->gain_request(aout, gain);
451 }
452 
453 static inline void aout_RestartRequest(audio_output_t *aout, unsigned mode)
454 {
455  aout->events->restart_request(aout, mode);
456 }
457 
458 /**
459  * Default implementation for audio_output_t.time_get
460  */
461 static inline int aout_TimeGetDefault(audio_output_t *aout,
462  vlc_tick_t *restrict delay)
463 {
464  (void) aout; (void) delay;
465  return -1;
466 }
467 
468 /**
469  * Default implementation for audio_output_t.pause
470  *
471  * \warning This default callback implementation is suboptimal as it will
472  * discard some audio samples.
473  * Do not use this unless there are really no possible better alternatives.
474  */
475 static inline void aout_PauseDefault(audio_output_t *aout, bool paused,
477 {
478  if (paused)
479  aout->flush(aout);
480  (void) date;
481 }
482 
483 /* Audio output filters */
484 
485 /**
486  * Enable or disable an audio filter ("audio-filter")
487  *
488  * \param aout a valid audio output
489  * \param name a valid filter name
490  * \param add true to add the filter, false to remove it
491  * \return 0 on success, non-zero on failure.
492  */
493 VLC_API int aout_EnableFilter(audio_output_t *aout, const char *name, bool add);
494 
495 typedef struct
496 {
497  /**
498  * If the remap order differs from the WG4 order, a remap audio filter will
499  * be inserted to remap channels according to this array.
500  */
501  int remap[AOUT_CHANIDX_MAX];
502  /**
503  * If true, a filter will be inserted to add a headphones effect (like a
504  * binauralizer audio filter).
505  */
506  bool headphones;
508 
509 #define AOUT_FILTERS_CFG_INIT (aout_filters_cfg_t) \
510  { .remap = AOUT_CHAN_REMAP_INIT, \
511  .headphones = false, \
512  };
513 
514 typedef struct aout_filters aout_filters_t;
517  const audio_sample_format_t *,
518  const audio_sample_format_t *,
519  const aout_filters_cfg_t *cfg) VLC_USED;
520 #define aout_FiltersNew(o,inf,outf,remap) \
521  aout_FiltersNew(VLC_OBJECT(o),inf,outf,remap)
523 #define aout_FiltersDelete(o,f) \
524  aout_FiltersDelete(VLC_OBJECT(o),f)
530 
532 
533 /** @} */
534 
535 #endif /* VLC_AOUT_H */
void aout_FormatPrepare(audio_sample_format_t *p_format)
Definition: common.c:87
static void aout_DeviceReport(audio_output_t *aout, const char *id)
Report change of output device.
Definition: vlc_aout.h:428
#define AOUT_CHAN_REARCENTER
Definition: vlc_es.h:120
#define AOUT_CHAN_MIDDLERIGHT
Definition: vlc_es.h:124
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:462
static int aout_GainRequest(audio_output_t *aout, float gain)
Request a change of software audio amplification.
Definition: vlc_aout.h:449
Definition: vlc_aout.h:294
void(* flush)(audio_output_t *)
Flushes the playback buffers (mandatory, cannot be NULL).
Definition: vlc_aout.h:230
static void aout_MuteReport(audio_output_t *aout, bool mute)
Report change of muted flag to the core and UI.
Definition: vlc_aout.h:411
Definition: vlc_aout.h:496
static void aout_HotplugReport(audio_output_t *aout, const char *id, const char *name)
Report a device hot-plug event.
Definition: vlc_aout.h:438
Definition: vlc_aout.h:292
Definition: vlc_aout.h:296
static unsigned aout_FormatNbChannels(const audio_sample_format_t *fmt)
Definition: vlc_aout.h:376
void(* mute_report)(audio_output_t *, bool)
Definition: vlc_aout.h:119
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
Definition: filters.c:345
Definition: vlc_aout.h:293
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:403
#define AOUT_CHAN_CENTER
Definition: vlc_es.h:117
#define static_assert
Definition: vlc_fixups.h:362
void aout_FiltersChangeViewpoint(aout_filters_t *, const vlc_viewpoint_t *vp)
Definition: filters.c:796
audio format description
Definition: vlc_es.h:81
static void aout_RestartRequest(audio_output_t *aout, unsigned mode)
Definition: vlc_aout.h:454
Data block definition and functions.
#define AOUT_CHAN_LFE
Definition: vlc_es.h:125
void(* timing_report)(audio_output_t *, vlc_tick_t system_now, vlc_tick_t pts)
Definition: vlc_aout.h:117
Definition: vlc_aout.h:116
void aout_Deinterleave(void *dst, const void *src, unsigned samples, unsigned channels, vlc_fourcc_t fourcc)
int64_t vlc_tick_t
High precision date or time interval.
Definition: vlc_tick.h:45
Definition: vlc_aout.h:295
uint32_t vlc_fourcc_t
Definition: fourcc_gen.c:33
block_t * aout_FiltersDrain(aout_filters_t *)
Definition: filters.c:756
block_t * aout_FiltersPlay(aout_filters_t *, block_t *, float rate)
Definition: filters.c:719
Definition: vlc_aout.h:288
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:476
Viewpoints.
Definition: vlc_viewpoint.h:41
static void aout_PolicyReport(audio_output_t *aout, bool cork)
Report audio policy status.
Definition: vlc_aout.h:420
int aout_EnableFilter(audio_output_t *aout, const char *name, bool add)
Enable or disable an audio filter ("audio-filter")
Definition: common.c:539
uint16_t i_physical_channels
Definition: vlc_es.h:88
#define AOUT_CHAN_MAX
Definition: vlc_es.h:153
Video output thread descriptor.
Definition: vlc_vout.h:60
Definition: vlc_aout.h:287
video format description
Definition: vlc_es.h:349
#define AOUT_CHAN_REARRIGHT
Definition: vlc_es.h:122
Definition: vlc_aout.h:290
int aout_MuteGet(audio_output_t *)
Gets the audio output stream mute flag.
Definition: output.c:692
#define aout_FiltersNew(o, inf, outf, remap)
Definition: vlc_aout.h:521
const char name[16]
Definition: httpd.c:1269
void(* volume_report)(audio_output_t *, float)
Definition: vlc_aout.h:118
vlc_chan_order_idx_t
Definition: vlc_aout.h:284
#define AOUT_CHAN_MIDDLELEFT
Definition: vlc_es.h:123
const struct vlc_audio_output_events * events
Definition: vlc_aout.h:281
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
float aout_VolumeGet(audio_output_t *)
Gets the volume of the audio output stream (independent of mute).
Definition: output.c:640
#define VLC_API
Definition: fourcc_gen.c:31
Audio output object.
Definition: vlc_aout.h:140
Definition: vlc_aout.h:291
static const uint32_t pi_vlc_chan_order_wg4[]
It describes the audio channel order VLC expect.
Definition: vlc_aout.h:316
int aout_MuteSet(audio_output_t *, bool)
Sets the audio output stream mute flag.
Definition: output.c:701
#define AOUT_CHAN_REARLEFT
Definition: vlc_es.h:121
vout_thread_t * aout_filter_GetVout(filter_t *, const video_format_t *)
Definition: filters.c:385
Structure describing a filter.
Definition: vlc_filter.h:72
int aout_DeviceSet(audio_output_t *, const char *)
Selects an audio output device.
Definition: output.c:727
const char * aout_FormatPrintChannels(const audio_sample_format_t *)
Definition: common.c:105
#define vlc_popcount(x)
Bit weight / population count.
Definition: vlc_common.h:731
Definition: vlc_aout.h:286
#define AOUT_CHAN_LEFT
Definition: vlc_es.h:118
#define aout_FiltersDelete(o, f)
Definition: vlc_aout.h:524
Definition: vlc_block.h:117
int aout_VolumeSet(audio_output_t *, float)
Sets the volume of the audio output stream.
Definition: output.c:650
char * aout_DeviceGet(audio_output_t *)
Gets the currently selected device.
Definition: output.c:717
#define aout_FormatPrint(o, t, f)
Definition: vlc_aout.h:385
void aout_ChannelReorder(void *, size_t, uint8_t, const uint8_t *, vlc_fourcc_t)
unsigned int aout_BitsPerSample(vlc_fourcc_t i_format)
Definition: common.c:41
bool aout_FiltersAdjustResampling(aout_filters_t *, int)
Definition: filters.c:707
#define AOUT_CHAN_RIGHT
Definition: vlc_es.h:119
void(* device_report)(audio_output_t *, const char *)
Definition: vlc_aout.h:121
int aout_VolumeUpdate(audio_output_t *, int, float *)
Raises the volume.
Definition: output.c:666
This file defines the elementary streams format types.
void(* restart_request)(audio_output_t *, unsigned)
Definition: vlc_aout.h:123
VLC object common members.
Definition: vlc_objects.h:43
void(* policy_report)(audio_output_t *, bool)
Definition: vlc_aout.h:120
#define VLC_USED
Definition: fourcc_gen.c:32
Definition: vlc_aout.h:289
void aout_FiltersFlush(aout_filters_t *)
Definition: filters.c:788
void aout_Interleave(void *dst, const void *const *planes, unsigned samples, unsigned channels, vlc_fourcc_t fourcc)
int aout_DevicesList(audio_output_t *, char ***, char ***)
Enumerates possible audio output devices.
Definition: output.c:749
int(* gain_request)(audio_output_t *, float)
Definition: vlc_aout.h:124
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.
void(* hotplug_report)(audio_output_t *, const char *, const char *)
Definition: vlc_aout.h:122