audio_output.h
上传用户:riyaled888
上传日期:2009-03-27
资源大小:7338k
文件大小:8k
源码类别:

多媒体

开发平台:

MultiPlatform

  1. /*****************************************************************************
  2.  * audio_output.h : audio output interface
  3.  *****************************************************************************
  4.  * Copyright (C) 2002 VideoLAN
  5.  * $Id: audio_output.h 8860 2004-09-30 16:46:37Z gbazin $
  6.  *
  7.  * Authors: Christophe Massiot <massiot@via.ecp.fr>
  8.  *
  9.  * This program is free software; you can redistribute it and/or modify
  10.  * it under the terms of the GNU General Public License as published by
  11.  * the Free Software Foundation; either version 2 of the License, or
  12.  * (at your option) any later version.
  13.  *
  14.  * This program is distributed in the hope that it will be useful,
  15.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17.  * GNU General Public License for more details.
  18.  *
  19.  * You should have received a copy of the GNU General Public License
  20.  * along with this program; if not, write to the Free Software
  21.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
  22.  *****************************************************************************/
  23. #ifndef _VLC_AUDIO_OUTPUT_H
  24. #define _VLC_AUDIO_OUTPUT_H 1
  25. #include "vlc_es.h"
  26. #define AOUT_FMTS_IDENTICAL( p_first, p_second ) (                          
  27.     ((p_first)->i_format == (p_second)->i_format)                           
  28.       && ((p_first)->i_rate == (p_second)->i_rate)                          
  29.       && ((p_first)->i_physical_channels == (p_second)->i_physical_channels)
  30.       && ((p_first)->i_original_channels == (p_second)->i_original_channels) )
  31. /* Check if i_rate == i_rate and i_channels == i_channels */
  32. #define AOUT_FMTS_SIMILAR( p_first, p_second ) (                            
  33.     ((p_first)->i_rate == (p_second)->i_rate)                               
  34.       && ((p_first)->i_physical_channels == (p_second)->i_physical_channels)
  35.       && ((p_first)->i_original_channels == (p_second)->i_original_channels) )
  36. #ifdef WORDS_BIGENDIAN
  37. #   define AOUT_FMT_S16_NE VLC_FOURCC('s','1','6','b')
  38. #   define AOUT_FMT_U16_NE VLC_FOURCC('u','1','6','b')
  39. #else
  40. #   define AOUT_FMT_S16_NE VLC_FOURCC('s','1','6','l')
  41. #   define AOUT_FMT_U16_NE VLC_FOURCC('u','1','6','l')
  42. #endif
  43. #define AOUT_FMT_NON_LINEAR( p_format )                                    
  44.     ( ((p_format)->i_format == VLC_FOURCC('s','p','d','i'))                
  45.        || ((p_format)->i_format == VLC_FOURCC('a','5','2',' '))            
  46.        || ((p_format)->i_format == VLC_FOURCC('d','t','s',' ')) )
  47. /* This is heavily borrowed from libmad, by Robert Leslie <rob@mars.org> */
  48. /*
  49.  * Fixed-point format: 0xABBBBBBB
  50.  * A == whole part      (sign + 3 bits)
  51.  * B == fractional part (28 bits)
  52.  *
  53.  * Values are signed two's complement, so the effective range is:
  54.  * 0x80000000 to 0x7fffffff
  55.  *       -8.0 to +7.9999999962747097015380859375
  56.  *
  57.  * The smallest representable value is:
  58.  * 0x00000001 == 0.0000000037252902984619140625 (i.e. about 3.725e-9)
  59.  *
  60.  * 28 bits of fractional accuracy represent about
  61.  * 8.6 digits of decimal accuracy.
  62.  *
  63.  * Fixed-point numbers can be added or subtracted as normal
  64.  * integers, but multiplication requires shifting the 64-bit result
  65.  * from 56 fractional bits back to 28 (and rounding.)
  66.  */
  67. typedef int32_t vlc_fixed_t;
  68. #define FIXED32_FRACBITS 28
  69. #define FIXED32_MIN ((vlc_fixed_t) -0x80000000L)
  70. #define FIXED32_MAX ((vlc_fixed_t) +0x7fffffffL)
  71. #define FIXED32_ONE ((vlc_fixed_t) 0x10000000)
  72. /*
  73.  * Channels descriptions
  74.  */
  75. /* Values available for physical and original channels */
  76. #define AOUT_CHAN_CENTER            0x1
  77. #define AOUT_CHAN_LEFT              0x2
  78. #define AOUT_CHAN_RIGHT             0x4
  79. #define AOUT_CHAN_REARCENTER        0x10
  80. #define AOUT_CHAN_REARLEFT          0x20
  81. #define AOUT_CHAN_REARRIGHT         0x40
  82. #define AOUT_CHAN_MIDDLELEFT        0x100
  83. #define AOUT_CHAN_MIDDLERIGHT       0x200
  84. #define AOUT_CHAN_LFE               0x1000
  85. /* Values available for original channels only */
  86. #define AOUT_CHAN_DOLBYSTEREO       0x10000
  87. #define AOUT_CHAN_DUALMONO          0x20000
  88. #define AOUT_CHAN_REVERSESTEREO     0x40000
  89. #define AOUT_CHAN_PHYSMASK          0xFFFF
  90. #define AOUT_CHAN_MAX               9
  91. /* Values used for the audio-device and audio-channels object variables */
  92. #define AOUT_VAR_MONO               1
  93. #define AOUT_VAR_STEREO             2
  94. #define AOUT_VAR_2F2R               4
  95. #define AOUT_VAR_3F2R               5
  96. #define AOUT_VAR_5_1                6
  97. #define AOUT_VAR_6_1                7
  98. #define AOUT_VAR_7_1                8
  99. #define AOUT_VAR_SPDIF              10
  100. #define AOUT_VAR_CHAN_STEREO        1
  101. #define AOUT_VAR_CHAN_RSTEREO       2
  102. #define AOUT_VAR_CHAN_LEFT          3
  103. #define AOUT_VAR_CHAN_RIGHT         4
  104. #define AOUT_VAR_CHAN_DOLBYS        5
  105. /*****************************************************************************
  106.  * aout_buffer_t : audio output buffer
  107.  *****************************************************************************/
  108. struct aout_buffer_t
  109. {
  110.     byte_t *                p_buffer;
  111.     int                     i_alloc_type;
  112.     /* i_size is the real size of the buffer (used for debug ONLY), i_nb_bytes
  113.      * is the number of significative bytes in it. */
  114.     size_t                  i_size, i_nb_bytes;
  115.     unsigned int            i_nb_samples;
  116.     mtime_t                 start_date, end_date;
  117.     struct aout_buffer_t *  p_next;
  118.     /** Private data (aout_buffer_t will disappear soon so no need for an
  119.      * aout_buffer_sys_t type) */
  120.     void * p_sys;
  121.     /** This way the release can be overloaded */
  122.     void (*pf_release)( aout_buffer_t * );
  123. };
  124. /* Size of a frame for S/PDIF output. */
  125. #define AOUT_SPDIF_SIZE 6144
  126. /* Number of samples in an A/52 frame. */
  127. #define A52_FRAME_NB 1536
  128. /*****************************************************************************
  129.  * audio_date_t : date incrementation without long-term rounding errors
  130.  *****************************************************************************/
  131. struct audio_date_t
  132. {
  133.     mtime_t  date;
  134.     uint32_t i_divider;
  135.     uint32_t i_remainder;
  136. };
  137. /*****************************************************************************
  138.  * Prototypes
  139.  *****************************************************************************/
  140. /* From common.c : */
  141. #define aout_New(a) __aout_New(VLC_OBJECT(a))
  142. VLC_EXPORT( aout_instance_t *, __aout_New, ( vlc_object_t * ) );
  143. VLC_EXPORT( void, aout_Delete, ( aout_instance_t * ) );
  144. VLC_EXPORT( void, aout_DateInit, ( audio_date_t *, uint32_t ) );
  145. VLC_EXPORT( void, aout_DateSet, ( audio_date_t *, mtime_t ) );
  146. VLC_EXPORT( void, aout_DateMove, ( audio_date_t *, mtime_t ) );
  147. VLC_EXPORT( mtime_t, aout_DateGet, ( const audio_date_t * ) );
  148. VLC_EXPORT( mtime_t, aout_DateIncrement, ( audio_date_t *, uint32_t ) );
  149. VLC_EXPORT( int, aout_CheckChannelReorder, ( const uint32_t *, const uint32_t *, uint32_t, int, int * ) );
  150. VLC_EXPORT( void, aout_ChannelReorder, ( uint8_t *, int, int, const int *, int ) );
  151. /* From dec.c : */
  152. #define aout_DecNew(a, b, c) __aout_DecNew(VLC_OBJECT(a), b, c)
  153. VLC_EXPORT( aout_input_t *, __aout_DecNew, ( vlc_object_t *, aout_instance_t **, audio_sample_format_t * ) );
  154. VLC_EXPORT( int, aout_DecDelete, ( aout_instance_t *, aout_input_t * ) );
  155. VLC_EXPORT( aout_buffer_t *, aout_DecNewBuffer, ( aout_instance_t *, aout_input_t *, size_t ) );
  156. VLC_EXPORT( void, aout_DecDeleteBuffer, ( aout_instance_t *, aout_input_t *, aout_buffer_t * ) );
  157. VLC_EXPORT( int, aout_DecPlay, ( aout_instance_t *, aout_input_t *, aout_buffer_t * ) );
  158. /* From intf.c : */
  159. #define aout_VolumeGet(a, b) __aout_VolumeGet(VLC_OBJECT(a), b)
  160. VLC_EXPORT( int, __aout_VolumeGet, ( vlc_object_t *, audio_volume_t * ) );
  161. #define aout_VolumeSet(a, b) __aout_VolumeSet(VLC_OBJECT(a), b)
  162. VLC_EXPORT( int, __aout_VolumeSet, ( vlc_object_t *, audio_volume_t ) );
  163. #define aout_VolumeInfos(a, b) __aout_VolumeInfos(VLC_OBJECT(a), b)
  164. VLC_EXPORT( int, __aout_VolumeInfos, ( vlc_object_t *, audio_volume_t * ) );
  165. #define aout_VolumeUp(a, b, c) __aout_VolumeUp(VLC_OBJECT(a), b, c)
  166. VLC_EXPORT( int, __aout_VolumeUp, ( vlc_object_t *, int, audio_volume_t * ) );
  167. #define aout_VolumeDown(a, b, c) __aout_VolumeDown(VLC_OBJECT(a), b, c)
  168. VLC_EXPORT( int, __aout_VolumeDown, ( vlc_object_t *, int, audio_volume_t * ) );
  169. #define aout_VolumeMute(a, b) __aout_VolumeMute(VLC_OBJECT(a), b)
  170. VLC_EXPORT( int, __aout_VolumeMute, ( vlc_object_t *, audio_volume_t * ) );
  171. VLC_EXPORT( int, aout_Restart, ( aout_instance_t * p_aout ) );
  172. VLC_EXPORT( int, aout_FindAndRestart, ( vlc_object_t *, const char *, vlc_value_t, vlc_value_t, void * ) );
  173. VLC_EXPORT( int, aout_ChannelsRestart, ( vlc_object_t *, const char *, vlc_value_t, vlc_value_t, void * ) );
  174. #endif /* _VLC_AUDIO_OUTPUT_H */