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
2006-06-19 21:53:48 +00:00
along with PulseAudio ; if not , write to the Free Software
2004-07-16 19:56:36 +00:00
Foundation , Inc . , 59 Temple Place , Suite 330 , Boston , MA 02111 - 1307
USA .
* * */
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>
# include <pulsecore/source.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>
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
2008-05-15 23:34:41 +00:00
static inline pa_bool_t 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
2011-05-17 22:31:10 +01:00
pa_source_output * sync_prev , * sync_next ;
/* Also see http://pulseaudio.org/wiki/InternalVolumes */
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 */
pa_bool_t volume_writable : 1 ;
pa_bool_t muted : 1 ;
/* if TRUE then the source we are connected to and/or the volume
* set is worth remembering , i . e . was explicitly chosen by the
* user and not automatically . module - stream - restore looks for
* this . */
pa_bool_t 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 */
/* Called whenver the latency range of the source changes. Called
* from IO context . */
void ( * update_source_latency_range ) ( pa_source_output * o ) ; /* may be NULL */
2009-08-15 00:48:14 +02:00
/* Called whenver the fixed latency of the source changes, if there
* 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 */
2007-11-21 01:30:40 +00:00
void ( * suspend ) ( pa_source_output * o , pa_bool_t 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 */
void ( * suspend_within_thread ) ( pa_source_output * o , pa_bool_t b ) ; /* may be NULL */
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
/* Return the current latency (i.e. length of bufferd 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
* is moved to a source and if it returns FALSE the move
* will not be allowed */
pa_bool_t ( * may_move_to ) ( pa_source_output * o , pa_source * s ) ; /* may be NULL */
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 ;
pa_bool_t muted : 1 ;
2009-01-27 00:52:28 +01:00
pa_bool_t 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 ;
2011-05-17 22:31:10 +01:00
pa_source_output * sync_prev , * sync_next ;
2008-05-15 23:34:41 +00:00
/* 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 ;
2011-05-17 22:31:10 +01:00
pa_source_output * sync_base ;
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 ;
pa_bool_t muted : 1 ;
2008-08-18 17:46:57 +02:00
pa_bool_t sample_spec_is_set : 1 ;
pa_bool_t channel_map_is_set : 1 ;
2009-01-27 23:35:55 +01:00
2011-05-17 22:31:10 +01:00
pa_bool_t volume_is_set : 1 , volume_factor_is_set : 1 , volume_factor_source_is_set : 1 ;
pa_bool_t muted_is_set : 1 ;
pa_bool_t volume_is_absolute : 1 ;
pa_bool_t volume_writable : 1 ;
pa_bool_t 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 ) ;
2011-05-17 21:56:10 +01:00
pa_bool_t 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 ) ;
void pa_source_output_new_data_set_muted ( pa_source_output_new_data * data , pa_bool_t mute ) ;
2011-05-17 21:56:10 +01:00
pa_bool_t pa_source_output_new_data_set_source ( pa_source_output_new_data * data , pa_source * s , pa_bool_t save ) ;
pa_bool_t 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
2009-01-13 19:06:10 +02:00
void pa_source_output_cork ( pa_source_output * o , pa_bool_t b ) ;
2008-05-15 23:34:41 +00:00
int pa_source_output_set_rate ( pa_source_output * o , uint32_t rate ) ;
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
/* External code may request disconnection with this funcion */
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 ) ;
2011-05-17 22:31:10 +01:00
pa_bool_t pa_source_output_is_volume_readable ( pa_source_output * o ) ;
2011-05-17 21:56:10 +01:00
pa_bool_t pa_source_output_is_passthrough ( pa_source_output * o ) ;
2011-05-17 22:31:10 +01:00
void pa_source_output_set_volume ( pa_source_output * o , const pa_cvolume * volume , pa_bool_t save , pa_bool_t absolute ) ;
pa_cvolume * pa_source_output_get_volume ( pa_source_output * o , pa_cvolume * volume , pa_bool_t absolute ) ;
void pa_source_output_set_mute ( pa_source_output * o , pa_bool_t mute , pa_bool_t save ) ;
pa_bool_t pa_source_output_get_mute ( pa_source_output * o ) ;
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 ) ;
2009-01-23 22:38:30 +01:00
pa_bool_t pa_source_output_may_move ( pa_source_output * o ) ;
2008-10-21 18:24:45 +02:00
pa_bool_t pa_source_output_may_move_to ( pa_source_output * o , pa_source * dest ) ;
2009-01-27 23:35:55 +01:00
int pa_source_output_move_to ( pa_source_output * o , pa_source * dest , pa_bool_t save ) ;
2006-08-03 22:30:45 +00:00
2009-01-23 22:38:30 +01:00
/* The same as pa_source_output_move_to() but in two seperate steps,
* first the detaching from the old source , then the attaching to the
* new source */
int pa_source_output_start_move ( pa_source_output * o ) ;
2009-01-27 23:35:55 +01:00
int pa_source_output_finish_move ( pa_source_output * o , pa_source * dest , pa_bool_t 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 ) ;
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