?? vlc_aout.h
字號:
/***************************************************************************** * audio_output.h : audio output interface ***************************************************************************** * Copyright (C) 2002-2005 the VideoLAN team * $Id: 98a2a584749596f7c9cc444909fbac4167a1a479 $ * * Authors: Christophe Massiot <massiot@via.ecp.fr> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/#ifndef VLC_AOUT_H#define VLC_AOUT_H 1/** * \file * This file defines functions, structures and macros for audio output object */# ifdef __cplusplusextern "C" {# endif#include "vlc_es.h"#define AOUT_FMTS_IDENTICAL( p_first, p_second ) ( \ ((p_first)->i_format == (p_second)->i_format) \ && ((p_first)->i_rate == (p_second)->i_rate) \ && ((p_first)->i_physical_channels == (p_second)->i_physical_channels)\ && ((p_first)->i_original_channels == (p_second)->i_original_channels) )/* Check if i_rate == i_rate and i_channels == i_channels */#define AOUT_FMTS_SIMILAR( p_first, p_second ) ( \ ((p_first)->i_rate == (p_second)->i_rate) \ && ((p_first)->i_physical_channels == (p_second)->i_physical_channels)\ && ((p_first)->i_original_channels == (p_second)->i_original_channels) )#ifdef WORDS_BIGENDIAN# define AOUT_FMT_S16_NE VLC_FOURCC('s','1','6','b')# define AOUT_FMT_U16_NE VLC_FOURCC('u','1','6','b')# define AOUT_FMT_S24_NE VLC_FOURCC('s','2','4','b')# define AOUT_FMT_S32_NE VLC_FOURCC('s','3','2','b')# define AOUT_FMT_SPDIF_NE VLC_FOURCC('s','p','d','b')#else# define AOUT_FMT_S16_NE VLC_FOURCC('s','1','6','l')# define AOUT_FMT_U16_NE VLC_FOURCC('u','1','6','l')# define AOUT_FMT_S24_NE VLC_FOURCC('s','2','4','l')# define AOUT_FMT_S32_NE VLC_FOURCC('s','3','2','l')# define AOUT_FMT_SPDIF_NE VLC_FOURCC('s','p','d','i')#endif#define AOUT_FMT_NON_LINEAR( p_format ) \ ( ((p_format)->i_format == VLC_FOURCC('s','p','d','i')) \ || ((p_format)->i_format == VLC_FOURCC('s','p','d','b')) \ || ((p_format)->i_format == VLC_FOURCC('a','5','2',' ')) \ || ((p_format)->i_format == VLC_FOURCC('d','t','s',' ')) )/* This is heavily borrowed from libmad, by Robert Leslie <rob@mars.org> *//* * Fixed-point format: 0xABBBBBBB * A == whole part (sign + 3 bits) * B == fractional part (28 bits) * * Values are signed two's complement, so the effective range is: * 0x80000000 to 0x7fffffff * -8.0 to +7.9999999962747097015380859375 * * The smallest representable value is: * 0x00000001 == 0.0000000037252902984619140625 (i.e. about 3.725e-9) * * 28 bits of fractional accuracy represent about * 8.6 digits of decimal accuracy. * * Fixed-point numbers can be added or subtracted as normal * integers, but multiplication requires shifting the 64-bit result * from 56 fractional bits back to 28 (and rounding.) */typedef int32_t vlc_fixed_t;#define FIXED32_FRACBITS 28#define FIXED32_MIN ((vlc_fixed_t) -0x80000000L)#define FIXED32_MAX ((vlc_fixed_t) +0x7fffffffL)#define FIXED32_ONE ((vlc_fixed_t) 0x10000000)/* * Channels descriptions *//* Values available for physical and original channels */#define AOUT_CHAN_CENTER 0x1#define AOUT_CHAN_LEFT 0x2#define AOUT_CHAN_RIGHT 0x4#define AOUT_CHAN_REARCENTER 0x10#define AOUT_CHAN_REARLEFT 0x20#define AOUT_CHAN_REARRIGHT 0x40#define AOUT_CHAN_MIDDLELEFT 0x100#define AOUT_CHAN_MIDDLERIGHT 0x200#define AOUT_CHAN_LFE 0x1000/* Values available for original channels only */#define AOUT_CHAN_DOLBYSTEREO 0x10000#define AOUT_CHAN_DUALMONO 0x20000#define AOUT_CHAN_REVERSESTEREO 0x40000#define AOUT_CHAN_PHYSMASK 0xFFFF#define AOUT_CHAN_MAX 9/* Values used for the audio-device and audio-channels object variables */#define AOUT_VAR_MONO 1#define AOUT_VAR_STEREO 2#define AOUT_VAR_2F2R 4#define AOUT_VAR_3F2R 5#define AOUT_VAR_5_1 6#define AOUT_VAR_6_1 7#define AOUT_VAR_7_1 8#define AOUT_VAR_SPDIF 10#define AOUT_VAR_CHAN_STEREO 1#define AOUT_VAR_CHAN_RSTEREO 2#define AOUT_VAR_CHAN_LEFT 3#define AOUT_VAR_CHAN_RIGHT 4#define AOUT_VAR_CHAN_DOLBYS 5/***************************************************************************** * Main audio output structures *****************************************************************************//** audio output buffer */struct aout_buffer_t{ uint8_t * p_buffer; int i_alloc_type; /* i_size is the real size of the buffer (used for debug ONLY), i_nb_bytes * is the number of significative bytes in it. */ size_t i_size, i_nb_bytes; unsigned int i_nb_samples; mtime_t start_date, end_date; bool b_discontinuity; /* Set on discontinuity (for non pcm stream) */ struct aout_buffer_t * p_next; /** Private data (aout_buffer_t will disappear soon so no need for an * aout_buffer_sys_t type) */ void * p_sys; /** This way the release can be overloaded */ void (*pf_release)( aout_buffer_t * );};#define aout_BufferFree( p_buffer ) do { \ if( p_buffer != NULL && (p_buffer)->i_alloc_type == AOUT_ALLOC_HEAP ) \ { \ free( p_buffer ); \ } \ p_buffer = NULL; } while(0)/* Size of a frame for S/PDIF output. */#define AOUT_SPDIF_SIZE 6144/* Number of samples in an A/52 frame. */#define A52_FRAME_NB 1536/* Max input rate factor (1/4 -> 4) */#define AOUT_MAX_INPUT_RATE (4)/** date incrementation helper structure without long-term * rounding errors */struct audio_date_t{ mtime_t date; uint32_t i_divider; uint32_t i_remainder;};/** allocation of memory in the audio output */typedef struct aout_alloc_t{ int i_alloc_type; int i_bytes_per_sec;} aout_alloc_t;#define AOUT_ALLOC_NONE 0#define AOUT_ALLOC_STACK 1#define AOUT_ALLOC_HEAP 2/** audio output mixer */typedef struct aout_mixer_t{ audio_sample_format_t mixer; aout_alloc_t output_alloc; module_t * p_module; struct aout_mixer_sys_t * p_sys; void (* pf_do_work)( struct aout_instance_t *, struct aout_buffer_t * ); /** If b_error == 1, there is no mixer. */ bool b_error; /** Multiplier used to raise or lower the volume of the sound in * software. Beware, this creates sound distortion and should be avoided * as much as possible. This isn't available for non-float32 mixer. */ float f_multiplier;} aout_mixer_t;/** audio output buffer FIFO */struct aout_fifo_t{ aout_buffer_t * p_first; aout_buffer_t ** pp_last; audio_date_t end_date;};/* */typedef struct{ vout_thread_t *(*pf_request_vout)( void *,
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -