aout_internal.h
上传用户:kjfoods
上传日期:2020-07-06
资源大小:29949k
文件大小:11k
源码类别:

midi

开发平台:

Unix_Linux

  1. /*****************************************************************************
  2.  * aout_internal.h : internal defines for audio output
  3.  *****************************************************************************
  4.  * Copyright (C) 2002 the VideoLAN team
  5.  * $Id: ca2576e9d241c6a9c0aca9f019eba678625a43ad $
  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., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
  22.  *****************************************************************************/
  23. #if defined(__PLUGIN__) || defined(__BUILTIN__) || !defined(__LIBVLC__)
  24. # error This header file can only be included from LibVLC.
  25. #endif
  26. #ifndef __LIBVLC_AOUT_INTERNAL_H
  27. # define __LIBVLC_AOUT_INTERNAL_H 1
  28. #include <assert.h>
  29. #if defined( __APPLE__ ) || defined( SYS_BSD )
  30. #undef HAVE_ALLOCA
  31. #endif
  32. #ifdef HAVE_ALLOCA
  33. #   define ALLOCA_TEST( p_alloc, p_new_buffer )                             
  34.         if ( (p_alloc)->i_alloc_type == AOUT_ALLOC_STACK )                  
  35.         {                                                                   
  36.             (p_new_buffer) = alloca( i_alloc_size + sizeof(aout_buffer_t) );
  37.             i_alloc_type = AOUT_ALLOC_STACK;                                
  38.         }                                                                   
  39.         else
  40. #else
  41. #   define ALLOCA_TEST( p_alloc, p_new_buffer )
  42. #endif
  43. #define aout_BufferAlloc( p_alloc, i_nb_usec, p_previous_buffer,            
  44.                           p_new_buffer )                                    
  45.     if ( (p_alloc)->i_alloc_type == AOUT_ALLOC_NONE )                       
  46.     {                                                                       
  47.         (p_new_buffer) = p_previous_buffer;                                 
  48.     }                                                                       
  49.     else                                                                    
  50.     {                                                                       
  51.         int i_alloc_size, i_alloc_type;                                     
  52.         i_alloc_size = (int)( (uint64_t)(p_alloc)->i_bytes_per_sec          
  53.                                             * (i_nb_usec) / 1000000 + 1 );  
  54.         ALLOCA_TEST( p_alloc, p_new_buffer )                                
  55.         {                                                                   
  56.             (p_new_buffer) = malloc( i_alloc_size + sizeof(aout_buffer_t) );
  57.             i_alloc_type = AOUT_ALLOC_HEAP;                                 
  58.         }                                                                   
  59.         if ( p_new_buffer != NULL )                                         
  60.         {                                                                   
  61.             (p_new_buffer)->i_alloc_type = i_alloc_type;                    
  62.             (p_new_buffer)->i_size = i_alloc_size;                          
  63.             (p_new_buffer)->p_buffer = (uint8_t *)(p_new_buffer)            
  64.                                          + sizeof(aout_buffer_t);           
  65.             (p_new_buffer)->b_discontinuity = false;                        
  66.             if ( (p_previous_buffer) != NULL )                              
  67.             {                                                               
  68.                 (p_new_buffer)->start_date =                                
  69.                            ((aout_buffer_t *)p_previous_buffer)->start_date;
  70.                 (p_new_buffer)->end_date =                                  
  71.                            ((aout_buffer_t *)p_previous_buffer)->end_date;  
  72.             }                                                               
  73.         }                                                                   
  74.         /* we'll keep that for a while --Meuuh */                           
  75.         /* else printf("%s:%dn", __FILE__, __LINE__); */                   
  76.     }
  77. struct aout_filter_owner_sys_t
  78. {
  79.     aout_instance_t *p_aout;
  80.     aout_input_t    *p_input;
  81. };
  82. /****************************************************************************
  83.  * Prototypes
  84.  *****************************************************************************/
  85. /* From input.c : */
  86. int aout_InputNew( aout_instance_t * p_aout, aout_input_t * p_input, const aout_request_vout_t * );
  87. int aout_InputDelete( aout_instance_t * p_aout, aout_input_t * p_input );
  88. int aout_InputPlay( aout_instance_t * p_aout, aout_input_t * p_input,
  89.                     aout_buffer_t * p_buffer, int i_input_rate );
  90. /* From filters.c : */
  91. int aout_FiltersCreatePipeline ( aout_instance_t * p_aout, aout_filter_t ** pp_filters, int * pi_nb_filters, const audio_sample_format_t * p_input_format, const audio_sample_format_t * p_output_format );
  92. void aout_FiltersDestroyPipeline ( aout_instance_t * p_aout, aout_filter_t ** pp_filters, int i_nb_filters );
  93. void  aout_FiltersPlay ( aout_instance_t * p_aout, aout_filter_t ** pp_filters, int i_nb_filters, aout_buffer_t ** pp_input_buffer );
  94. void aout_FiltersHintBuffers( aout_instance_t * p_aout, aout_filter_t ** pp_filters, int i_nb_filters, aout_alloc_t * p_first_alloc );
  95. /* From mixer.c : */
  96. int aout_MixerNew( aout_instance_t * p_aout );
  97. void aout_MixerDelete( aout_instance_t * p_aout );
  98. void aout_MixerRun( aout_instance_t * p_aout );
  99. int aout_MixerMultiplierSet( aout_instance_t * p_aout, float f_multiplier );
  100. int aout_MixerMultiplierGet( aout_instance_t * p_aout, float * pf_multiplier );
  101. /* From output.c : */
  102. int aout_OutputNew( aout_instance_t * p_aout,
  103.                     audio_sample_format_t * p_format );
  104. void aout_OutputPlay( aout_instance_t * p_aout, aout_buffer_t * p_buffer );
  105. void aout_OutputDelete( aout_instance_t * p_aout );
  106. /* From common.c : */
  107. #define aout_New(a) __aout_New(VLC_OBJECT(a))
  108. /* Release with vlc_object_release() */
  109. aout_instance_t * __aout_New ( vlc_object_t * );
  110. void aout_FifoInit( aout_instance_t *, aout_fifo_t *, uint32_t );
  111. mtime_t aout_FifoNextStart( aout_instance_t *, aout_fifo_t * );
  112. void aout_FifoPush( aout_instance_t *, aout_fifo_t *, aout_buffer_t * );
  113. void aout_FifoSet( aout_instance_t *, aout_fifo_t *, mtime_t );
  114. void aout_FifoMoveDates( aout_instance_t *, aout_fifo_t *, mtime_t );
  115. void aout_FifoDestroy( aout_instance_t * p_aout, aout_fifo_t * p_fifo );
  116. void aout_FormatsPrint( aout_instance_t * p_aout, const char * psz_text, const audio_sample_format_t * p_format1, const audio_sample_format_t * p_format2 );
  117. /* From intf.c :*/
  118. int aout_VolumeSoftGet( aout_instance_t *, audio_volume_t * );
  119. int aout_VolumeSoftSet( aout_instance_t *, audio_volume_t );
  120. int aout_VolumeSoftInfos( aout_instance_t *, audio_volume_t * );
  121. int aout_VolumeNoneGet( aout_instance_t *, audio_volume_t * );
  122. int aout_VolumeNoneSet( aout_instance_t *, audio_volume_t );
  123. int aout_VolumeNoneInfos( aout_instance_t *, audio_volume_t * );
  124. /* From dec.c */
  125. #define aout_DecNew(a, b, c, d, e) __aout_DecNew(VLC_OBJECT(a), b, c, d, e)
  126. aout_input_t * __aout_DecNew( vlc_object_t *, aout_instance_t **,
  127.                               audio_sample_format_t *, const audio_replay_gain_t *,
  128.                               const aout_request_vout_t * );
  129. int aout_DecDelete ( aout_instance_t *, aout_input_t * );
  130. aout_buffer_t * aout_DecNewBuffer( aout_input_t *, size_t );
  131. void aout_DecDeleteBuffer( aout_instance_t *, aout_input_t *, aout_buffer_t * );
  132. int aout_DecPlay( aout_instance_t *, aout_input_t *, aout_buffer_t *, int i_input_rate );
  133. int aout_DecGetResetLost( aout_instance_t *, aout_input_t * );
  134. void aout_DecChangePause( aout_instance_t *, aout_input_t *, bool b_paused, mtime_t i_date );
  135. void aout_DecFlush( aout_instance_t *, aout_input_t * );
  136. /* Helpers */
  137. static inline void aout_lock_mixer( aout_instance_t *p_aout )
  138. {
  139.     vlc_mutex_lock( &p_aout->mixer_lock );
  140. }
  141. static inline void aout_unlock_mixer( aout_instance_t *p_aout )
  142. {
  143.     vlc_mutex_unlock( &p_aout->mixer_lock );
  144. }
  145. static inline void aout_lock_input_fifos( aout_instance_t *p_aout )
  146. {
  147.     vlc_mutex_lock( &p_aout->input_fifos_lock );
  148. }
  149. static inline void aout_unlock_input_fifos( aout_instance_t *p_aout )
  150. {
  151.     vlc_mutex_unlock( &p_aout->input_fifos_lock );
  152. }
  153. static inline void aout_lock_output_fifo( aout_instance_t *p_aout )
  154. {
  155.     vlc_mutex_lock( &p_aout->output_fifo_lock );
  156. }
  157. static inline void aout_unlock_output_fifo( aout_instance_t *p_aout )
  158. {
  159.     vlc_mutex_unlock( &p_aout->output_fifo_lock );
  160. }
  161. static inline void aout_lock_input( aout_instance_t *p_aout, aout_input_t * p_input )
  162. {
  163.     (void)p_aout;
  164.     vlc_mutex_lock( &p_input->lock );
  165. }
  166. static inline void aout_unlock_input( aout_instance_t *p_aout, aout_input_t * p_input )
  167. {
  168.     (void)p_aout;
  169.     vlc_mutex_unlock( &p_input->lock );
  170. }
  171. /**
  172.  * This function will safely mark aout input to be restarted as soon as
  173.  * possible to take configuration changes into account */
  174. static inline void AoutInputsMarkToRestart( aout_instance_t *p_aout )
  175. {
  176.     int i;
  177.     aout_lock_mixer( p_aout );
  178.     for( i = 0; i < p_aout->i_nb_inputs; i++ )
  179.         p_aout->pp_inputs[i]->b_restart = true;
  180.     aout_unlock_mixer( p_aout );
  181. }
  182. /* This function will add or remove a a module from a string list (comma
  183.  * separated). It will return true if there is a modification
  184.  * In case p_aout is NULL, we will use configuration instead of variable */
  185. static inline bool AoutChangeFilterString( vlc_object_t *p_obj, aout_instance_t * p_aout,
  186.                                            const char* psz_variable,
  187.                                            const char *psz_name, bool b_add )
  188. {
  189.     vlc_value_t val;
  190.     char *psz_parser;
  191.     if( *psz_name == '' )
  192.         return false;
  193.     if( p_aout )
  194.         var_Get( p_aout, psz_variable, &val );
  195.     else
  196.         val.psz_string = config_GetPsz( p_obj, "audio-filter" );
  197.     if( !val.psz_string )
  198.         val.psz_string = strdup("");
  199.     psz_parser = strstr( val.psz_string, psz_name );
  200.     if( ( b_add && psz_parser ) || ( !b_add && !psz_parser ) )
  201.     {
  202.         /* Nothing to do */
  203.         free( val.psz_string );
  204.         return false;
  205.     }
  206.     if( b_add )
  207.     {
  208.         char *psz_old = val.psz_string;
  209.         if( *psz_old )
  210.         {
  211.             if( asprintf( &val.psz_string, "%s:%s", psz_old, psz_name ) == -1 )
  212.                 val.psz_string = NULL;
  213.         }
  214.         else
  215.             val.psz_string = strdup( psz_name );
  216.         free( psz_old );
  217.     }
  218.     else
  219.     {
  220.         const int i_name = strlen( psz_name );
  221.         const char *psz_next;
  222.         psz_next = &psz_parser[i_name];
  223.         if( *psz_next == ':' )
  224.             psz_next++;
  225.         memmove( psz_parser, psz_next, strlen(psz_next)+1 );
  226.     }
  227.     if( p_aout )
  228.         var_Set( p_aout, psz_variable, val );
  229.     else
  230.         config_PutPsz( p_obj, psz_variable, val.psz_string );
  231.     free( val.psz_string );
  232.     return true;
  233. }
  234. #endif /* !__LIBVLC_AOUT_INTERNAL_H */