1 /*****************************************************************************
2 * aout_internal.h : internal defines for audio output
3 *****************************************************************************
4 * Copyright (C) 2002 the VideoLAN team
7 * Authors: Christophe Massiot <massiot@via.ecp.fr>
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.
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.
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 *****************************************************************************/
24 #if defined(__PLUGIN__) || defined(__BUILTIN__) || !defined(__LIBVLC__)
25 # error This header file can only be included from LibVLC.
28 #ifndef __LIBVLC_AOUT_INTERNAL_H
29 # define __LIBVLC_AOUT_INTERNAL_H 1
31 aout_buffer_t
*aout_BufferAlloc(aout_alloc_t
*allocation
, mtime_t microseconds
,
32 aout_buffer_t
*old_buffer
);
36 struct vout_thread_t
*(*pf_request_vout
)( void *, struct vout_thread_t
*,
37 video_format_t
*, bool );
39 } aout_request_vout_t
;
41 struct filter_owner_sys_t
43 aout_instance_t
*p_aout
;
44 aout_input_t
*p_input
;
47 block_t
*aout_FilterBufferNew( filter_t
*, int );
49 /** an input stream for the audio output */
52 /* When this lock is taken, the pipeline cannot be changed by a
56 audio_sample_format_t input
;
57 aout_alloc_t input_alloc
;
60 filter_t
* pp_filters
[AOUT_MAX_FILTERS
];
63 filter_t
* p_playback_rate_filter
;
66 filter_t
* pp_resamplers
[AOUT_MAX_FILTERS
];
68 int i_resampling_type
;
69 mtime_t i_resamp_start_date
;
70 int i_resamp_start_drift
;
72 /* Mixer information */
73 audio_replay_gain_t replay_gain
;
75 /* If b_restart == 1, the input pipeline will be re-created. */
78 /* If b_error == 1, there is no input pipeline. */
81 /* Did we just change the output format? (expect buffer inconsistencies) */
84 /* last rate from input */
85 int i_last_input_rate
;
96 aout_request_vout_t request_vout
;
99 aout_mixer_input_t mixer
;
102 /****************************************************************************
104 *****************************************************************************/
107 int aout_InputNew( aout_instance_t
* p_aout
, aout_input_t
* p_input
, const aout_request_vout_t
* );
108 int aout_InputDelete( aout_instance_t
* p_aout
, aout_input_t
* p_input
);
109 int aout_InputPlay( aout_instance_t
* p_aout
, aout_input_t
* p_input
,
110 aout_buffer_t
* p_buffer
, int i_input_rate
);
111 void aout_InputCheckAndRestart( aout_instance_t
* p_aout
, aout_input_t
* p_input
);
113 /* From filters.c : */
114 int aout_FiltersCreatePipeline ( aout_instance_t
* p_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
);
115 void aout_FiltersDestroyPipeline ( aout_instance_t
* p_aout
, filter_t
** pp_filters
, int i_nb_filters
);
116 void aout_FiltersPlay ( filter_t
** pp_filters
, unsigned i_nb_filters
, aout_buffer_t
** pp_input_buffer
);
117 void aout_FiltersHintBuffers( aout_instance_t
* p_aout
, filter_t
** pp_filters
, int i_nb_filters
, aout_alloc_t
* p_first_alloc
);
120 int aout_MixerNew( aout_instance_t
* p_aout
);
121 void aout_MixerDelete( aout_instance_t
* p_aout
);
122 void aout_MixerRun( aout_instance_t
* p_aout
);
123 int aout_MixerMultiplierSet( aout_instance_t
* p_aout
, float f_multiplier
);
124 int aout_MixerMultiplierGet( aout_instance_t
* p_aout
, float * pf_multiplier
);
126 /* From output.c : */
127 int aout_OutputNew( aout_instance_t
* p_aout
,
128 audio_sample_format_t
* p_format
);
129 void aout_OutputPlay( aout_instance_t
* p_aout
, aout_buffer_t
* p_buffer
);
130 void aout_OutputDelete( aout_instance_t
* p_aout
);
133 /* From common.c : */
134 #define aout_New(a) __aout_New(VLC_OBJECT(a))
135 /* Release with vlc_object_release() */
136 aout_instance_t
* __aout_New ( vlc_object_t
* );
138 void aout_FifoInit( aout_instance_t
*, aout_fifo_t
*, uint32_t );
139 mtime_t
aout_FifoNextStart( aout_instance_t
*, aout_fifo_t
* );
140 void aout_FifoPush( aout_instance_t
*, aout_fifo_t
*, aout_buffer_t
* );
141 void aout_FifoSet( aout_instance_t
*, aout_fifo_t
*, mtime_t
);
142 void aout_FifoMoveDates( aout_instance_t
*, aout_fifo_t
*, mtime_t
);
143 void aout_FifoDestroy( aout_instance_t
* p_aout
, aout_fifo_t
* p_fifo
);
144 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
);
145 bool aout_ChangeFilterString( vlc_object_t
*, aout_instance_t
*, const char *psz_variable
, const char *psz_name
, bool b_add
);
148 int aout_VolumeSoftGet( aout_instance_t
*, audio_volume_t
* );
149 int aout_VolumeSoftSet( aout_instance_t
*, audio_volume_t
);
150 int aout_VolumeSoftInfos( aout_instance_t
*, audio_volume_t
* );
151 int aout_VolumeNoneGet( aout_instance_t
*, audio_volume_t
* );
152 int aout_VolumeNoneSet( aout_instance_t
*, audio_volume_t
);
153 int aout_VolumeNoneInfos( aout_instance_t
*, audio_volume_t
* );
156 #define aout_DecNew(a, b, c, d, e) __aout_DecNew(VLC_OBJECT(a), b, c, d, e)
157 aout_input_t
* __aout_DecNew( vlc_object_t
*, aout_instance_t
**,
158 audio_sample_format_t
*, const audio_replay_gain_t
*,
159 const aout_request_vout_t
* );
160 int aout_DecDelete ( aout_instance_t
*, aout_input_t
* );
161 aout_buffer_t
* aout_DecNewBuffer( aout_input_t
*, size_t );
162 void aout_DecDeleteBuffer( aout_instance_t
*, aout_input_t
*, aout_buffer_t
* );
163 int aout_DecPlay( aout_instance_t
*, aout_input_t
*, aout_buffer_t
*, int i_input_rate
);
164 int aout_DecGetResetLost( aout_instance_t
*, aout_input_t
* );
165 void aout_DecChangePause( aout_instance_t
*, aout_input_t
*, bool b_paused
, mtime_t i_date
);
166 void aout_DecFlush( aout_instance_t
*, aout_input_t
* );
168 /* Audio output locking */
170 #if !defined (NDEBUG) \
171 && defined __linux__ && (defined (__i386__) || defined (__x86_64__))
172 # define AOUT_DEBUG 1
185 void aout_lock (unsigned);
186 void aout_unlock (unsigned);
189 # define aout_lock( i ) (void)0
190 # define aout_unlock( i ) (void)0
193 static inline void aout_lock_mixer( aout_instance_t
*p_aout
)
195 aout_lock( MIXER_LOCK
);
196 vlc_mutex_lock( &p_aout
->mixer_lock
);
199 static inline void aout_unlock_mixer( aout_instance_t
*p_aout
)
201 aout_unlock( MIXER_LOCK
);
202 vlc_mutex_unlock( &p_aout
->mixer_lock
);
205 static inline void aout_lock_input_fifos( aout_instance_t
*p_aout
)
207 aout_lock( INPUT_FIFO_LOCK
);
208 vlc_mutex_lock( &p_aout
->input_fifos_lock
);
211 static inline void aout_unlock_input_fifos( aout_instance_t
*p_aout
)
213 aout_unlock( INPUT_FIFO_LOCK
);
214 vlc_mutex_unlock( &p_aout
->input_fifos_lock
);
217 static inline void aout_lock_output_fifo( aout_instance_t
*p_aout
)
219 aout_lock( OUTPUT_FIFO_LOCK
);
220 vlc_mutex_lock( &p_aout
->output_fifo_lock
);
223 static inline void aout_unlock_output_fifo( aout_instance_t
*p_aout
)
225 aout_unlock( OUTPUT_FIFO_LOCK
);
226 vlc_mutex_unlock( &p_aout
->output_fifo_lock
);
229 static inline void aout_lock_input( aout_instance_t
*p_aout
, aout_input_t
* p_input
)
232 aout_lock( INPUT_LOCK
);
233 vlc_mutex_lock( &p_input
->lock
);
236 static inline void aout_unlock_input( aout_instance_t
*p_aout
, aout_input_t
* p_input
)
239 aout_unlock( INPUT_LOCK
);
240 vlc_mutex_unlock( &p_input
->lock
);
243 static inline void aout_lock_volume( aout_instance_t
*p_aout
)
245 aout_lock( VOLUME_VARS_LOCK
);
246 vlc_mutex_lock( &p_aout
->volume_vars_lock
);
249 static inline void aout_unlock_volume( aout_instance_t
*p_aout
)
251 aout_unlock( VOLUME_VARS_LOCK
);
252 vlc_mutex_unlock( &p_aout
->volume_vars_lock
);
258 * This function will safely mark aout input to be restarted as soon as
259 * possible to take configuration changes into account */
260 static inline void AoutInputsMarkToRestart( aout_instance_t
*p_aout
)
263 aout_lock_mixer( p_aout
);
264 for( i
= 0; i
< p_aout
->i_nb_inputs
; i
++ )
265 p_aout
->pp_inputs
[i
]->b_restart
= true;
266 aout_unlock_mixer( p_aout
);
269 #endif /* !__LIBVLC_AOUT_INTERNAL_H */