2007-10-28 19:13:50 +00:00
# ifndef foopulsesourceoutputhfoo
# define foopulsesourceoutputhfoo
2004-06-08 23:54:24 +00:00
2004-07-16 19:56:36 +00:00
/***
2006-06-19 21:53:48 +00:00
This file is part of PulseAudio .
2007-01-04 13:43:45 +00:00
2007-02-13 15:35:19 +00:00
Copyright 2004 - 2006 Lennart Poettering
2006-06-19 21:53:48 +00:00
PulseAudio is free software ; you can redistribute it and / or modify
2004-11-14 14:58:54 +00:00
it under the terms of the GNU Lesser General Public License as published
2009-03-03 20:23:02 +00:00
by the Free Software Foundation ; either version 2.1 of the License ,
2004-07-16 19:56:36 +00:00
or ( at your option ) any later version .
2007-01-04 13:43:45 +00:00
2006-06-19 21:53:48 +00:00
PulseAudio is distributed in the hope that it will be useful , but
2004-07-16 19:56:36 +00:00
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 .
2007-01-04 13:43:45 +00:00
2004-11-14 14:58:54 +00:00
You should have received a copy of the GNU Lesser General Public License
2014-11-26 14:14:51 +01:00
along with PulseAudio ; if not , see < http : //www.gnu.org/licenses/>.
2004-07-16 19:56:36 +00:00
* * */
2004-06-08 23:54:24 +00:00
# include <inttypes.h>
2004-06-15 17:05:03 +00:00
2006-01-11 01:17:39 +00:00
typedef struct pa_source_output pa_source_output ;
2006-06-19 21:53:48 +00:00
# include <pulse/sample.h>
2011-05-17 21:56:10 +01:00
# include <pulse/format.h>
2006-06-19 21:53:48 +00:00
# include <pulsecore/memblockq.h>
# include <pulsecore/resampler.h>
# include <pulsecore/module.h>
# include <pulsecore/client.h>
2011-05-11 11:54:04 +01:00
# include <pulsecore/source.h>
# include <pulsecore/core.h>
2009-01-28 01:46:27 +01:00
# include <pulsecore/sink-input.h>
2004-06-08 23:54:24 +00:00
2007-10-28 19:13:50 +00:00
typedef enum pa_source_output_state {
PA_SOURCE_OUTPUT_INIT ,
2004-09-14 20:53:25 +00:00
PA_SOURCE_OUTPUT_RUNNING ,
2004-09-26 17:02:26 +00:00
PA_SOURCE_OUTPUT_CORKED ,
2007-10-28 19:13:50 +00:00
PA_SOURCE_OUTPUT_UNLINKED
2006-01-27 16:25:31 +00:00
} pa_source_output_state_t ;
2004-09-14 20:53:25 +00:00
2013-06-27 19:28:09 +02:00
static inline bool PA_SOURCE_OUTPUT_IS_LINKED ( pa_source_output_state_t x ) {
2007-10-28 19:13:50 +00:00
return x = = PA_SOURCE_OUTPUT_RUNNING | | x = = PA_SOURCE_OUTPUT_CORKED ;
}
2006-08-13 19:55:17 +00:00
typedef enum pa_source_output_flags {
2007-10-28 19:13:50 +00:00
PA_SOURCE_OUTPUT_VARIABLE_RATE = 1 ,
PA_SOURCE_OUTPUT_DONT_MOVE = 2 ,
2007-11-21 01:30:40 +00:00
PA_SOURCE_OUTPUT_START_CORKED = 4 ,
PA_SOURCE_OUTPUT_NO_REMAP = 8 ,
PA_SOURCE_OUTPUT_NO_REMIX = 16 ,
PA_SOURCE_OUTPUT_FIX_FORMAT = 32 ,
PA_SOURCE_OUTPUT_FIX_RATE = 64 ,
2008-10-26 19:32:04 +01:00
PA_SOURCE_OUTPUT_FIX_CHANNELS = 128 ,
2009-02-03 02:23:46 +01:00
PA_SOURCE_OUTPUT_DONT_INHIBIT_AUTO_SUSPEND = 256 ,
2009-08-15 00:12:53 +02:00
PA_SOURCE_OUTPUT_NO_CREATE_ON_SUSPEND = 512 ,
2011-05-17 21:56:10 +01:00
PA_SOURCE_OUTPUT_KILL_ON_SUSPEND = 1024 ,
PA_SOURCE_OUTPUT_PASSTHROUGH = 2048
2006-08-13 19:55:17 +00:00
} pa_source_output_flags_t ;
2004-07-03 23:35:12 +00:00
struct pa_source_output {
2007-10-28 19:13:50 +00:00
pa_msgobject parent ;
2004-06-08 23:54:24 +00:00
uint32_t index ;
2007-10-28 19:13:50 +00:00
pa_core * core ;
2008-05-15 23:34:41 +00:00
2006-01-27 16:25:31 +00:00
pa_source_output_state_t state ;
2007-10-28 19:13:50 +00:00
pa_source_output_flags_t flags ;
2007-01-04 13:43:45 +00:00
2008-05-15 23:34:41 +00:00
char * driver ; /* may be NULL */
2008-06-20 22:32:41 +02:00
pa_proplist * proplist ;
2006-08-13 19:55:17 +00:00
pa_module * module ; /* may be NULL */
2007-10-28 19:13:50 +00:00
pa_client * client ; /* may be NULL */
2006-01-27 16:25:31 +00:00
2011-02-07 18:35:51 +02:00
pa_source * source ; /* NULL while being moved */
pa_source * destination_source ; /* only set by filter sources */
2006-01-27 16:25:31 +00:00
2008-06-13 21:56:19 +00:00
/* A source output can monitor just a single input of a sink, in which case we find it here */
pa_sink_input * direct_on_input ; /* may be NULL */
2006-01-11 01:17:39 +00:00
pa_sample_spec sample_spec ;
2006-01-27 16:25:31 +00:00
pa_channel_map channel_map ;
2011-05-17 21:56:10 +01:00
pa_format_info * format ;
2007-01-04 13:43:45 +00:00
2014-11-29 21:49:11 +05:00
/* Also see http://www.freedesktop.org/wiki/Software/PulseAudio/Documentation/Developer/Volumes/ */
2011-05-17 22:31:10 +01:00
pa_cvolume volume ; /* The volume clients are informed about */
pa_cvolume reference_ratio ; /* The ratio of the stream's volume to the source's reference volume */
pa_cvolume real_ratio ; /* The ratio of the stream's volume to the source's real volume */
pa_cvolume volume_factor ; /* An internally used volume factor that can be used by modules to apply effects and suchlike without having that visible to the outside */
pa_cvolume soft_volume ; /* The internal software volume we apply to all PCM data while it passes through. Usually calculated as real_ratio * volume_factor */
pa_cvolume volume_factor_source ; /* A second volume factor in format of the source this stream is connected to */
2013-06-27 19:28:09 +02:00
bool volume_writable : 1 ;
2011-05-17 22:31:10 +01:00
2013-06-27 19:28:09 +02:00
bool muted : 1 ;
2011-05-17 22:31:10 +01:00
2013-06-27 19:28:09 +02:00
/* if true then the source we are connected to and/or the volume
2011-05-17 22:31:10 +01:00
* set is worth remembering , i . e . was explicitly chosen by the
* user and not automatically . module - stream - restore looks for
* this . */
2013-06-27 19:28:09 +02:00
bool save_source : 1 , save_volume : 1 , save_muted : 1 ;
2009-01-27 23:35:55 +01:00
2009-01-27 00:52:28 +01:00
pa_resample_method_t requested_resample_method , actual_resample_method ;
2008-05-15 23:34:41 +00:00
2007-10-28 19:13:50 +00:00
/* Pushes a new memchunk into the output. Called from IO thread
* context . */
2008-06-20 22:32:41 +02:00
void ( * push ) ( pa_source_output * o , const pa_memchunk * chunk ) ; /* may NOT be NULL */
2007-10-28 19:13:50 +00:00
2008-05-15 23:34:41 +00:00
/* Only relevant for monitor sources right now: called when the
2008-06-20 22:32:41 +02:00
* recorded stream is rewound . Called from IO context */
void ( * process_rewind ) ( pa_source_output * o , size_t nbytes ) ; /* may be NULL */
2008-05-15 23:34:41 +00:00
/* Called whenever the maximum rewindable size of the source
* changes . Called from IO thread context . */
void ( * update_max_rewind ) ( pa_source_output * o , size_t nbytes ) ; /* may be NULL */
2008-06-20 22:32:41 +02:00
/* Called whenever the configured latency of the source
* changes . Called from IO context . */
void ( * update_source_requested_latency ) ( pa_source_output * o ) ; /* may be NULL */
2011-08-24 18:24:46 +02:00
/* Called whenever the latency range of the source changes. Called
2008-06-20 22:32:41 +02:00
* from IO context . */
void ( * update_source_latency_range ) ( pa_source_output * o ) ; /* may be NULL */
2011-08-24 18:24:46 +02:00
/* Called whenever the fixed latency of the source changes, if there
2009-08-15 00:48:14 +02:00
* is one . Called from IO context . */
void ( * update_source_fixed_latency ) ( pa_source_output * i ) ; /* may be NULL */
2007-10-28 19:13:50 +00:00
/* If non-NULL this function is called when the output is first
2011-05-17 22:31:10 +01:00
* connected to a source or when the rtpoll / asyncmsgq fields
* change . You usually don ' t need to implement this function
* unless you rewrite a source that is piggy - backed onto
* another . Called from IO thread context */
2007-10-28 19:13:50 +00:00
void ( * attach ) ( pa_source_output * o ) ; /* may be NULL */
/* If non-NULL this function is called when the output is
* disconnected from its source . Called from IO thread context */
void ( * detach ) ( pa_source_output * o ) ; /* may be NULL */
2009-04-01 03:04:39 +02:00
/* If non-NULL called whenever the source this output is attached
2007-10-28 19:13:50 +00:00
* to suspends or resumes . Called from main context */
2013-06-27 19:28:09 +02:00
void ( * suspend ) ( pa_source_output * o , bool b ) ; /* may be NULL */
2007-10-28 19:13:50 +00:00
2009-04-07 00:46:20 +02:00
/* If non-NULL called whenever the source this output is attached
* to suspends or resumes . Called from IO context */
2013-06-27 19:28:09 +02:00
void ( * suspend_within_thread ) ( pa_source_output * o , bool b ) ; /* may be NULL */
2009-04-07 00:46:20 +02:00
2009-04-01 03:04:39 +02:00
/* If non-NULL called whenever the source output is moved to a new
2011-05-17 22:31:10 +01:00
* source . Called from main context after the source output has been
* detached from the old source and before it has been attached to
* the new source . If dest is NULL the move was executed in two
2009-08-15 00:03:50 +02:00
* phases and the second one failed ; the stream will be destroyed
* after this call . */
2009-04-01 03:04:39 +02:00
void ( * moving ) ( pa_source_output * o , pa_source * dest ) ; /* may be NULL */
2008-05-15 23:34:41 +00:00
2007-10-28 19:13:50 +00:00
/* Supposed to unlink and destroy this stream. Called from main
* context . */
2008-06-20 22:32:41 +02:00
void ( * kill ) ( pa_source_output * o ) ; /* may NOT be NULL */
2007-10-28 19:13:50 +00:00
2011-08-24 18:24:46 +02:00
/* Return the current latency (i.e. length of buffered audio) of
2008-06-20 22:32:41 +02:00
this stream . Called from main context . This is added to what the
PA_SOURCE_OUTPUT_MESSAGE_GET_LATENCY message sent to the IO thread
returns */
2006-08-11 23:31:59 +00:00
pa_usec_t ( * get_latency ) ( pa_source_output * o ) ; /* may be NULL */
2004-06-15 17:05:03 +00:00
2008-10-21 18:24:45 +02:00
/* If non-NULL this function is called from thread context if the
2008-05-15 23:34:41 +00:00
* state changes . The old state is found in thread_info . state . */
void ( * state_change ) ( pa_source_output * o , pa_source_output_state_t state ) ; /* may be NULL */
2007-01-04 13:43:45 +00:00
2008-10-21 18:24:45 +02:00
/* If non-NULL this function is called before this source output
2013-06-27 19:28:09 +02:00
* is moved to a source and if it returns false the move
2008-10-21 18:24:45 +02:00
* will not be allowed */
2013-06-27 19:28:09 +02:00
bool ( * may_move_to ) ( pa_source_output * o , pa_source * s ) ; /* may be NULL */
2008-10-21 18:24:45 +02:00
2009-02-12 03:18:05 +01:00
/* If non-NULL this function is used to dispatch asynchronous
* control events . */
void ( * send_event ) ( pa_source_output * o , const char * event , pa_proplist * data ) ;
2011-05-17 22:31:10 +01:00
/* If non-NULL this function is called whenever the source output
* volume changes . Called from main context */
void ( * volume_changed ) ( pa_source_output * o ) ; /* may be NULL */
/* If non-NULL this function is called whenever the source output
* mute status changes . Called from main context */
void ( * mute_changed ) ( pa_source_output * o ) ; /* may be NULL */
2007-10-28 19:13:50 +00:00
struct {
pa_source_output_state_t state ;
2011-05-17 22:31:10 +01:00
pa_cvolume soft_volume ;
2013-06-27 19:28:09 +02:00
bool muted : 1 ;
2011-05-17 22:31:10 +01:00
2013-06-27 19:28:09 +02:00
bool attached : 1 ; /* True only between ->attach() and ->detach() calls */
2007-10-28 19:13:50 +00:00
pa_sample_spec sample_spec ;
pa_resampler * resampler ; /* may be NULL */
2008-05-15 23:34:41 +00:00
/* We maintain a delay memblockq here for source outputs that
* don ' t implement rewind ( ) */
pa_memblockq * delay_memblockq ;
/* The requested latency for the source */
pa_usec_t requested_source_latency ;
2008-06-13 21:56:19 +00:00
pa_sink_input * direct_on_input ; /* may be NULL */
2007-10-28 19:13:50 +00:00
} thread_info ;
2004-06-15 17:05:03 +00:00
void * userdata ;
2004-06-08 23:54:24 +00:00
} ;
2009-08-21 21:27:44 +02:00
PA_DECLARE_PUBLIC_CLASS ( pa_source_output ) ;
2007-10-28 19:13:50 +00:00
# define PA_SOURCE_OUTPUT(o) pa_source_output_cast(o)
enum {
PA_SOURCE_OUTPUT_MESSAGE_GET_LATENCY ,
PA_SOURCE_OUTPUT_MESSAGE_SET_RATE ,
PA_SOURCE_OUTPUT_MESSAGE_SET_STATE ,
2008-05-15 23:34:41 +00:00
PA_SOURCE_OUTPUT_MESSAGE_SET_REQUESTED_LATENCY ,
PA_SOURCE_OUTPUT_MESSAGE_GET_REQUESTED_LATENCY ,
2011-05-17 22:31:10 +01:00
PA_SOURCE_OUTPUT_MESSAGE_SET_SOFT_VOLUME ,
PA_SOURCE_OUTPUT_MESSAGE_SET_SOFT_MUTE ,
2007-10-28 19:13:50 +00:00
PA_SOURCE_OUTPUT_MESSAGE_MAX
} ;
2009-02-12 03:18:05 +01:00
typedef struct pa_source_output_send_event_hook_data {
pa_source_output * source_output ;
const char * event ;
pa_proplist * data ;
} pa_source_output_send_event_hook_data ;
2006-08-13 19:55:17 +00:00
typedef struct pa_source_output_new_data {
2009-08-28 23:24:09 +02:00
pa_source_output_flags_t flags ;
2008-05-15 23:34:41 +00:00
pa_proplist * proplist ;
2008-06-13 21:56:19 +00:00
pa_sink_input * direct_on_input ;
2008-05-15 23:34:41 +00:00
const char * driver ;
2006-08-13 19:55:17 +00:00
pa_module * module ;
pa_client * client ;
pa_source * source ;
2011-02-07 18:35:51 +02:00
pa_source * destination_source ;
2006-08-13 19:55:17 +00:00
2008-08-18 17:46:57 +02:00
pa_resample_method_t resample_method ;
2006-08-13 19:55:17 +00:00
pa_sample_spec sample_spec ;
pa_channel_map channel_map ;
2011-05-17 21:56:10 +01:00
pa_format_info * format ;
pa_idxset * req_formats ;
pa_idxset * nego_formats ;
2006-08-13 19:55:17 +00:00
2011-05-17 22:31:10 +01:00
pa_cvolume volume , volume_factor , volume_factor_source ;
2013-06-27 19:28:09 +02:00
bool muted : 1 ;
2011-05-17 22:31:10 +01:00
2013-06-27 19:28:09 +02:00
bool sample_spec_is_set : 1 ;
bool channel_map_is_set : 1 ;
2009-01-27 23:35:55 +01:00
2013-06-27 19:28:09 +02:00
bool volume_is_set : 1 , volume_factor_is_set : 1 , volume_factor_source_is_set : 1 ;
bool muted_is_set : 1 ;
2011-05-17 22:31:10 +01:00
2013-06-27 19:28:09 +02:00
bool volume_is_absolute : 1 ;
2011-05-17 22:31:10 +01:00
2013-06-27 19:28:09 +02:00
bool volume_writable : 1 ;
2011-05-17 22:31:10 +01:00
2013-06-27 19:28:09 +02:00
bool save_source : 1 , save_volume : 1 , save_muted : 1 ;
2006-08-13 19:55:17 +00:00
} pa_source_output_new_data ;
2008-05-15 23:34:41 +00:00
pa_source_output_new_data * pa_source_output_new_data_init ( pa_source_output_new_data * data ) ;
void pa_source_output_new_data_set_sample_spec ( pa_source_output_new_data * data , const pa_sample_spec * spec ) ;
void pa_source_output_new_data_set_channel_map ( pa_source_output_new_data * data , const pa_channel_map * map ) ;
2013-06-27 19:28:09 +02:00
bool pa_source_output_new_data_is_passthrough ( pa_source_output_new_data * data ) ;
2011-05-17 22:31:10 +01:00
void pa_source_output_new_data_set_volume ( pa_source_output_new_data * data , const pa_cvolume * volume ) ;
void pa_source_output_new_data_apply_volume_factor ( pa_source_output_new_data * data , const pa_cvolume * volume_factor ) ;
void pa_source_output_new_data_apply_volume_factor_source ( pa_source_output_new_data * data , const pa_cvolume * volume_factor ) ;
2013-06-27 19:28:09 +02:00
void pa_source_output_new_data_set_muted ( pa_source_output_new_data * data , bool mute ) ;
bool pa_source_output_new_data_set_source ( pa_source_output_new_data * data , pa_source * s , bool save ) ;
bool pa_source_output_new_data_set_formats ( pa_source_output_new_data * data , pa_idxset * formats ) ;
2008-05-15 23:34:41 +00:00
void pa_source_output_new_data_done ( pa_source_output_new_data * data ) ;
2007-10-28 19:13:50 +00:00
/* To be called by the implementing module only */
2009-02-03 03:14:20 +01:00
int pa_source_output_new (
pa_source_output * * o ,
2006-08-13 19:55:17 +00:00
pa_core * core ,
2009-08-28 23:24:09 +02:00
pa_source_output_new_data * data ) ;
2006-01-27 16:25:31 +00:00
2007-10-28 19:13:50 +00:00
void pa_source_output_put ( pa_source_output * o ) ;
void pa_source_output_unlink ( pa_source_output * o ) ;
2004-06-08 23:54:24 +00:00
2009-01-13 19:06:10 +02:00
void pa_source_output_set_name ( pa_source_output * o , const char * name ) ;
2007-10-28 19:13:50 +00:00
2009-01-13 19:06:10 +02:00
pa_usec_t pa_source_output_set_requested_latency ( pa_source_output * o , pa_usec_t usec ) ;
2008-05-15 23:34:41 +00:00
2013-06-27 19:28:09 +02:00
void pa_source_output_cork ( pa_source_output * o , bool b ) ;
2008-05-15 23:34:41 +00:00
int pa_source_output_set_rate ( pa_source_output * o , uint32_t rate ) ;
2011-11-06 18:20:01 +05:30
int pa_source_output_update_rate ( pa_source_output * o ) ;
2008-05-15 23:34:41 +00:00
2009-08-13 02:17:24 +02:00
size_t pa_source_output_get_max_rewind ( pa_source_output * o ) ;
2007-10-28 19:13:50 +00:00
/* Callable by everyone */
2004-09-14 20:53:25 +00:00
2011-08-24 18:24:46 +02:00
/* External code may request disconnection with this function */
2006-01-11 01:17:39 +00:00
void pa_source_output_kill ( pa_source_output * o ) ;
2004-06-14 20:30:50 +00:00
2009-01-13 19:06:10 +02:00
pa_usec_t pa_source_output_get_latency ( pa_source_output * o , pa_usec_t * source_latency ) ;
2013-06-27 19:28:09 +02:00
bool pa_source_output_is_volume_readable ( pa_source_output * o ) ;
bool pa_source_output_is_passthrough ( pa_source_output * o ) ;
void pa_source_output_set_volume ( pa_source_output * o , const pa_cvolume * volume , bool save , bool absolute ) ;
pa_cvolume * pa_source_output_get_volume ( pa_source_output * o , pa_cvolume * volume , bool absolute ) ;
2011-05-17 22:31:10 +01:00
2013-06-27 19:28:09 +02:00
void pa_source_output_set_mute ( pa_source_output * o , bool mute , bool save ) ;
2011-05-17 21:56:10 +01:00
2009-02-05 04:07:27 +01:00
void pa_source_output_update_proplist ( pa_source_output * o , pa_update_mode_t mode , pa_proplist * p ) ;
2004-09-16 00:05:56 +00:00
2006-01-27 16:25:31 +00:00
pa_resample_method_t pa_source_output_get_resample_method ( pa_source_output * o ) ;
2004-09-16 00:05:56 +00:00
2009-02-12 03:18:05 +01:00
void pa_source_output_send_event ( pa_source_output * o , const char * name , pa_proplist * data ) ;
2013-06-27 19:28:09 +02:00
bool pa_source_output_may_move ( pa_source_output * o ) ;
bool pa_source_output_may_move_to ( pa_source_output * o , pa_source * dest ) ;
int pa_source_output_move_to ( pa_source_output * o , pa_source * dest , bool save ) ;
2006-08-03 22:30:45 +00:00
2011-08-24 18:24:46 +02:00
/* The same as pa_source_output_move_to() but in two separate steps,
2009-01-23 22:38:30 +01:00
* first the detaching from the old source , then the attaching to the
* new source */
int pa_source_output_start_move ( pa_source_output * o ) ;
2013-06-27 19:28:09 +02:00
int pa_source_output_finish_move ( pa_source_output * o , pa_source * dest , bool save ) ;
2009-08-15 00:03:50 +02:00
void pa_source_output_fail_move ( pa_source_output * o ) ;
2009-01-23 22:38:30 +01:00
2007-10-28 19:13:50 +00:00
# define pa_source_output_get_state(o) ((o)->state)
2008-05-15 23:34:41 +00:00
pa_usec_t pa_source_output_get_requested_latency ( pa_source_output * o ) ;
2007-10-28 19:13:50 +00:00
/* To be used exclusively by the source driver thread */
void pa_source_output_push ( pa_source_output * o , const pa_memchunk * chunk ) ;
2008-05-15 23:34:41 +00:00
void pa_source_output_process_rewind ( pa_source_output * o , size_t nbytes ) ;
void pa_source_output_update_max_rewind ( pa_source_output * o , size_t nbytes ) ;
void pa_source_output_set_state_within_thread ( pa_source_output * o , pa_source_output_state_t state ) ;
2007-10-28 19:13:50 +00:00
int pa_source_output_process_msg ( pa_msgobject * mo , int code , void * userdata , int64_t offset , pa_memchunk * chunk ) ;
2008-05-15 23:34:41 +00:00
pa_usec_t pa_source_output_set_requested_latency_within_thread ( pa_source_output * o , pa_usec_t usec ) ;
2014-04-15 13:56:04 +03:00
/* Called from the main thread, from source.c only. The normal way to set the
* source output volume is to call pa_source_output_set_volume ( ) , but the flat
* volume logic in source . c needs also a function that doesn ' t do all the extra
* stuff that pa_source_output_set_volume ( ) does . This function simply sets
* o - > volume and fires change notifications . */
void pa_source_output_set_volume_direct ( pa_source_output * o , const pa_cvolume * volume ) ;
2014-08-04 21:12:53 +03:00
/* Called from the main thread, from source.c only. This shouldn't be a public
* function , but the flat volume logic in source . c currently needs a way to
* directly set the source output reference ratio . This function simply sets
* o - > reference_ratio and logs a message if the value changes . */
void pa_source_output_set_reference_ratio ( pa_source_output * o , const pa_cvolume * ratio ) ;
2009-08-13 02:14:19 +02:00
# define pa_source_output_assert_io_context(s) \
pa_assert ( pa_thread_mq_get ( ) | | ! PA_SOURCE_OUTPUT_IS_LINKED ( ( s ) - > state ) )
2004-06-08 23:54:24 +00:00
# endif