2007-10-28 19:13:50 +00:00
# ifndef foopulsesinkinputhfoo
# define foopulsesinkinputhfoo
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
Copyright 2006 Pierre Ossman < ossman @ cendio . se > for Cendio AB
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>
2006-01-11 01:17:39 +00:00
typedef struct pa_sink_input pa_sink_input ;
2006-06-19 21:53:48 +00:00
# include <pulse/sample.h>
2011-02-28 13:23:23 +05:30
# include <pulse/format.h>
2006-08-13 16:19:56 +00:00
# include <pulsecore/hook-list.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>
2006-08-13 16:19:56 +00:00
# include <pulsecore/sink.h>
# include <pulsecore/core.h>
2004-06-08 23:54:24 +00:00
2006-01-27 16:25:31 +00:00
typedef enum pa_sink_input_state {
2010-10-01 01:32:37 +01:00
PA_SINK_INPUT_INIT , /*< The stream is not active yet, because pa_sink_input_put() has not been called yet */
2006-07-28 23:27:16 +00:00
PA_SINK_INPUT_DRAINED , /*< The stream stopped playing because there was no data to play */
2007-10-28 19:13:50 +00:00
PA_SINK_INPUT_RUNNING , /*< The stream is alive and kicking */
2006-07-28 23:27:16 +00:00
PA_SINK_INPUT_CORKED , /*< The stream was corked on user request */
2007-10-28 19:13:50 +00:00
PA_SINK_INPUT_UNLINKED /*< The stream is dead */
2009-08-16 00:45:56 +02:00
/* FIXME: we need a state for MOVING here */
2006-01-27 16:25:31 +00:00
} pa_sink_input_state_t ;
2004-09-14 20:53:25 +00:00
2008-05-15 23:34:41 +00:00
static inline pa_bool_t PA_SINK_INPUT_IS_LINKED ( pa_sink_input_state_t x ) {
2007-10-28 19:13:50 +00:00
return x = = PA_SINK_INPUT_DRAINED | | x = = PA_SINK_INPUT_RUNNING | | x = = PA_SINK_INPUT_CORKED ;
}
2006-08-13 16:19:56 +00:00
typedef enum pa_sink_input_flags {
PA_SINK_INPUT_VARIABLE_RATE = 1 ,
2007-10-28 19:13:50 +00:00
PA_SINK_INPUT_DONT_MOVE = 2 ,
2007-11-21 01:30:40 +00:00
PA_SINK_INPUT_START_CORKED = 4 ,
PA_SINK_INPUT_NO_REMAP = 8 ,
PA_SINK_INPUT_NO_REMIX = 16 ,
PA_SINK_INPUT_FIX_FORMAT = 32 ,
PA_SINK_INPUT_FIX_RATE = 64 ,
2008-10-26 19:32:04 +01:00
PA_SINK_INPUT_FIX_CHANNELS = 128 ,
PA_SINK_INPUT_DONT_INHIBIT_AUTO_SUSPEND = 256 ,
2009-08-15 00:12:53 +02:00
PA_SINK_INPUT_NO_CREATE_ON_SUSPEND = 512 ,
2010-07-16 16:46:28 -05:00
PA_SINK_INPUT_KILL_ON_SUSPEND = 1024 ,
PA_SINK_INPUT_PASSTHROUGH = 2048
2006-08-13 16:19:56 +00:00
} pa_sink_input_flags_t ;
2004-07-03 23:35:12 +00:00
struct pa_sink_input {
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 ;
/* Please note that this state should only be read with
* pa_sink_input_get_state ( ) . That function will transparently
* merge the thread_info . drained value in . */
2006-01-27 16:25:31 +00:00
pa_sink_input_state_t state ;
2006-08-13 16:19:56 +00:00
pa_sink_input_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 ;
2007-01-04 13:43:45 +00:00
pa_module * module ; /* may be NULL */
pa_client * client ; /* may be NULL */
2006-01-27 16:25:31 +00:00
2011-02-07 18:35:51 +02:00
pa_sink * sink ; /* NULL while we are being moved */
pa_sink * origin_sink ; /* only set by filter sinks */
2007-01-04 13:43:45 +00:00
2008-06-13 21:56:19 +00:00
/* A sink input may be connected to multiple source outputs
* directly , so that they don ' t get mixed data of the entire
* source . */
pa_idxset * direct_outputs ;
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-02-28 13:23:23 +05:30
pa_format_info * format ;
2006-07-29 15:06:49 +00:00
2007-10-28 19:13:50 +00:00
pa_sink_input * sync_prev , * sync_next ;
2007-01-04 13:43:45 +00:00
2009-04-13 22:50:24 +02:00
/* Also see http://pulseaudio.org/wiki/InternalVolumes */
2009-08-19 02:55:02 +02:00
pa_cvolume volume ; /* The volume clients are informed about */
pa_cvolume reference_ratio ; /* The ratio of the stream's volume to the sink's reference volume */
pa_cvolume real_ratio ; /* The ratio of the stream's volume to the sink'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 */
2009-09-11 03:26:25 +02:00
pa_cvolume volume_factor_sink ; /* A second volume factor in format of the sink this stream is connected to */
2011-03-27 23:00:26 +03:00
pa_bool_t volume_writable : 1 ;
2009-01-27 23:35:55 +01:00
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_sink : 1 , save_volume : 1 , save_muted : 1 ;
2007-10-28 19:13:50 +00:00
2009-01-27 00:52:28 +01:00
pa_resample_method_t requested_resample_method , actual_resample_method ;
2007-10-28 19:13:50 +00:00
2008-05-15 23:34:41 +00:00
/* Returns the chunk of audio data and drops it from the
* queue . Returns - 1 on failure . Called from IO thread context . If
* data needs to be generated from scratch then please in the
* specified length request_nbytes . This is an optimization
* only . If less data is available , it ' s fine to return a smaller
* block . If more data is already ready , it is better to return
* the full block . */
int ( * pop ) ( pa_sink_input * i , size_t request_nbytes , pa_memchunk * chunk ) ; /* may NOT be NULL */
/* Rewind the queue by the specified number of bytes. Called just
* before peek ( ) if it is called at all . Only called if the sink
* input driver ever plans to call
* pa_sink_input_request_rewind ( ) . Called from IO context . */
void ( * process_rewind ) ( pa_sink_input * i , size_t nbytes ) ; /* may NOT be NULL */
/* Called whenever the maximum rewindable size of the sink
* changes . Called from IO context . */
void ( * update_max_rewind ) ( pa_sink_input * i , size_t nbytes ) ; /* may be NULL */
2007-10-28 19:13:50 +00:00
2009-04-01 12:35:44 +02:00
/* Called whenever the maximum request size of the sink
2008-06-20 22:32:41 +02:00
* changes . Called from IO context . */
void ( * update_max_request ) ( pa_sink_input * i , size_t nbytes ) ; /* may be NULL */
/* Called whenever the configured latency of the sink
* changes . Called from IO context . */
void ( * update_sink_requested_latency ) ( pa_sink_input * i ) ; /* may be NULL */
/* Called whenver the latency range of the sink changes. Called
* from IO context . */
void ( * update_sink_latency_range ) ( pa_sink_input * i ) ; /* may be NULL */
2009-08-15 00:48:14 +02:00
/* Called whenver the fixed latency of the sink changes, if there
* is one . Called from IO context . */
void ( * update_sink_fixed_latency ) ( pa_sink_input * i ) ; /* may be NULL */
2007-10-28 19:13:50 +00:00
/* If non-NULL this function is called when the input is first
* connected to a sink or when the rtpoll / asyncmsgq fields
* change . You usually don ' t need to implement this function
* unless you rewrite a sink that is piggy - backed onto
* another . Called from IO thread context */
void ( * attach ) ( pa_sink_input * i ) ; /* may be NULL */
/* If non-NULL this function is called when the output is
* disconnected from its sink . Called from IO thread context */
void ( * detach ) ( pa_sink_input * i ) ; /* may be NULL */
2009-04-01 03:04:39 +02:00
/* If non-NULL called whenever the sink this input 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_sink_input * i , pa_bool_t b ) ; /* may be NULL */
2009-04-07 00:46:20 +02:00
/* If non-NULL called whenever the sink this input is attached
* to suspends or resumes . Called from IO context */
void ( * suspend_within_thread ) ( pa_sink_input * i , pa_bool_t b ) ; /* may be NULL */
2009-04-01 03:04:39 +02:00
/* If non-NULL called whenever the sink input is moved to a new
* sink . Called from main context after the sink input has been
* detached from the old sink and before it has been attached to
2009-08-15 00:03:50 +02:00
* the new sink . If dest is NULL the move was executed in two
* 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_sink_input * i , pa_sink * dest ) ; /* may be NULL */
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_sink_input * i ) ; /* 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_SINK_INPUT_MESSAGE_GET_LATENCY message sent to the IO thread
returns */
2006-08-11 23:31:59 +00:00
pa_usec_t ( * get_latency ) ( pa_sink_input * i ) ; /* may be NULL */
2004-06-14 20:30:50 +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_sink_input * i , pa_sink_input_state_t state ) ; /* may be NULL */
2004-07-03 00:19:17 +00:00
2008-10-21 18:24:45 +02:00
/* If non-NULL this function is called before this sink input is
* move to a sink and if it returns FALSE the move will not
* be allowed */
pa_bool_t ( * may_move_to ) ( pa_sink_input * i , pa_sink * s ) ; /* may be NULL */
2009-02-12 03:18:05 +01:00
/* If non-NULL this function is used to dispatch asynchronous
2009-08-21 02:56:17 +02:00
* control events . Called from main context . */
void ( * send_event ) ( pa_sink_input * i , const char * event , pa_proplist * data ) ; /* may be NULL */
/* If non-NULL this function is called whenever the sink input
* volume changes . Called from main context */
void ( * volume_changed ) ( pa_sink_input * i ) ; /* may be NULL */
/* If non-NULL this function is called whenever the sink input
* mute status changes . Called from main context */
void ( * mute_changed ) ( pa_sink_input * i ) ; /* may be NULL */
2009-02-12 03:18:05 +01:00
2007-10-28 19:13:50 +00:00
struct {
pa_sink_input_state_t state ;
pa_atomic_t drained ;
2006-07-29 15:06:49 +00:00
2009-01-27 04:39:07 +01:00
pa_cvolume soft_volume ;
pa_bool_t muted : 1 ;
pa_bool_t attached : 1 ; /* True only between ->attach() and ->detach() calls */
2009-08-27 00:07:15 +02:00
/* rewrite_nbytes: 0: rewrite nothing, (size_t) -1: rewrite everything, otherwise how many bytes to rewrite */
2009-01-27 04:39:07 +01:00
pa_bool_t rewrite_flush : 1 , dont_rewind_render : 1 ;
size_t rewrite_nbytes ;
uint64_t underrun_for , playing_for ;
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 history of resampled audio data here. */
pa_memblockq * render_memblockq ;
2007-10-28 19:13:50 +00:00
pa_sink_input * sync_prev , * sync_next ;
2008-05-15 23:34:41 +00:00
/* The requested latency for the sink */
pa_usec_t requested_sink_latency ;
2008-06-13 21:56:19 +00:00
pa_hashmap * direct_outputs ;
2007-10-28 19:13:50 +00:00
} thread_info ;
void * userdata ;
} ;
2009-08-21 21:27:44 +02:00
PA_DECLARE_PUBLIC_CLASS ( pa_sink_input ) ;
2007-10-28 19:13:50 +00:00
# define PA_SINK_INPUT(o) pa_sink_input_cast(o)
2006-07-29 15:06:49 +00:00
2007-10-28 19:13:50 +00:00
enum {
2009-01-27 04:39:07 +01:00
PA_SINK_INPUT_MESSAGE_SET_SOFT_VOLUME ,
PA_SINK_INPUT_MESSAGE_SET_SOFT_MUTE ,
2007-10-28 19:13:50 +00:00
PA_SINK_INPUT_MESSAGE_GET_LATENCY ,
PA_SINK_INPUT_MESSAGE_SET_RATE ,
PA_SINK_INPUT_MESSAGE_SET_STATE ,
2008-05-15 23:34:41 +00:00
PA_SINK_INPUT_MESSAGE_SET_REQUESTED_LATENCY ,
PA_SINK_INPUT_MESSAGE_GET_REQUESTED_LATENCY ,
2007-10-28 19:13:50 +00:00
PA_SINK_INPUT_MESSAGE_MAX
2004-06-08 23:54:24 +00:00
} ;
2009-02-12 03:18:05 +01:00
typedef struct pa_sink_input_send_event_hook_data {
pa_sink_input * sink_input ;
const char * event ;
pa_proplist * data ;
} pa_sink_input_send_event_hook_data ;
2006-08-13 16:19:56 +00:00
typedef struct pa_sink_input_new_data {
2009-08-28 23:24:09 +02:00
pa_sink_input_flags_t flags ;
2008-05-15 23:34:41 +00:00
pa_proplist * proplist ;
const char * driver ;
2006-08-13 16:19:56 +00:00
pa_module * module ;
pa_client * client ;
2007-01-04 13:43:45 +00:00
2006-08-13 16:19:56 +00:00
pa_sink * sink ;
2011-02-07 18:35:51 +02:00
pa_sink * origin_sink ;
2007-01-04 13:43:45 +00:00
2008-08-18 17:46:57 +02:00
pa_resample_method_t resample_method ;
pa_sink_input * sync_base ;
2006-08-13 16:19:56 +00:00
pa_sample_spec sample_spec ;
pa_channel_map channel_map ;
2011-02-28 13:23:23 +05:30
pa_format_info * format ;
pa_idxset * req_formats ;
pa_idxset * nego_formats ;
2008-10-07 01:37:38 +03:00
2009-09-11 03:26:25 +02:00
pa_cvolume volume , volume_factor , volume_factor_sink ;
2008-08-18 17:46:57 +02:00
pa_bool_t muted : 1 ;
2007-10-28 19:13:50 +00:00
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 04:39:07 +01:00
2009-09-11 03:26:25 +02:00
pa_bool_t volume_is_set : 1 , volume_factor_is_set : 1 , volume_factor_sink_is_set : 1 ;
2008-08-18 17:46:57 +02:00
pa_bool_t muted_is_set : 1 ;
2009-01-27 04:39:07 +01:00
2009-02-04 18:34:08 +01:00
pa_bool_t volume_is_absolute : 1 ;
2009-01-27 23:35:55 +01:00
2011-03-27 23:00:26 +03:00
pa_bool_t volume_writable : 1 ;
2009-01-27 23:35:55 +01:00
pa_bool_t save_sink : 1 , save_volume : 1 , save_muted : 1 ;
2006-08-13 16:19:56 +00:00
} pa_sink_input_new_data ;
pa_sink_input_new_data * pa_sink_input_new_data_init ( pa_sink_input_new_data * data ) ;
void pa_sink_input_new_data_set_sample_spec ( pa_sink_input_new_data * data , const pa_sample_spec * spec ) ;
void pa_sink_input_new_data_set_channel_map ( pa_sink_input_new_data * data , const pa_channel_map * map ) ;
2009-02-04 18:34:08 +01:00
void pa_sink_input_new_data_set_volume ( pa_sink_input_new_data * data , const pa_cvolume * volume ) ;
2009-02-05 01:22:05 +01:00
void pa_sink_input_new_data_apply_volume_factor ( pa_sink_input_new_data * data , const pa_cvolume * volume_factor ) ;
2009-09-11 03:26:25 +02:00
void pa_sink_input_new_data_apply_volume_factor_sink ( pa_sink_input_new_data * data , const pa_cvolume * volume_factor ) ;
2007-10-28 19:13:50 +00:00
void pa_sink_input_new_data_set_muted ( pa_sink_input_new_data * data , pa_bool_t mute ) ;
2011-02-28 13:23:23 +05:30
pa_bool_t pa_sink_input_new_data_set_sink ( pa_sink_input_new_data * data , pa_sink * s , pa_bool_t save ) ;
pa_bool_t pa_sink_input_new_data_set_formats ( pa_sink_input_new_data * data , pa_idxset * formats ) ;
2008-05-15 23:34:41 +00:00
void pa_sink_input_new_data_done ( pa_sink_input_new_data * data ) ;
2007-10-28 19:13:50 +00:00
/* To be called by the implementing module only */
2006-08-13 16:19:56 +00:00
2009-02-03 03:14:20 +01:00
int pa_sink_input_new (
pa_sink_input * * i ,
2006-08-13 19:55:17 +00:00
pa_core * core ,
2009-08-28 23:24:09 +02:00
pa_sink_input_new_data * data ) ;
2006-01-27 16:25:31 +00:00
2007-10-28 19:13:50 +00:00
void pa_sink_input_put ( pa_sink_input * i ) ;
void pa_sink_input_unlink ( pa_sink_input * i ) ;
2004-06-14 20:30:50 +00:00
2007-10-28 19:13:50 +00:00
void pa_sink_input_set_name ( pa_sink_input * i , const char * name ) ;
2004-09-14 20:53:25 +00:00
2008-05-15 23:34:41 +00:00
pa_usec_t pa_sink_input_set_requested_latency ( pa_sink_input * i , pa_usec_t usec ) ;
/* Request that the specified number of bytes already written out to
the hw device is rewritten , if possible . Please note that this is
only a kind request . The sink driver may not be able to fulfill it
fully - - or at all . If the request for a rewrite was successful , the
sink driver will call - > rewind ( ) and pass the number of bytes that
could be rewound in the HW device . This functionality is required for
implementing the " zero latency " write - through functionality . */
2009-01-15 00:40:06 +01:00
void pa_sink_input_request_rewind ( pa_sink_input * i , size_t nbytes , pa_bool_t rewrite , pa_bool_t flush , pa_bool_t dont_rewind_render ) ;
2008-05-15 23:34:41 +00:00
void pa_sink_input_cork ( pa_sink_input * i , pa_bool_t b ) ;
int pa_sink_input_set_rate ( pa_sink_input * i , uint32_t rate ) ;
2009-08-13 02:17:24 +02:00
/* This returns the sink's fields converted into out sample type */
size_t pa_sink_input_get_max_rewind ( pa_sink_input * i ) ;
size_t pa_sink_input_get_max_request ( pa_sink_input * i ) ;
2008-05-15 23:34:41 +00:00
/* Callable by everyone from main thread*/
2007-10-28 19:13:50 +00:00
/* External code may request disconnection with this function */
2006-01-11 01:17:39 +00:00
void pa_sink_input_kill ( pa_sink_input * i ) ;
2004-06-15 00:29:01 +00:00
2008-06-20 22:32:41 +02:00
pa_usec_t pa_sink_input_get_latency ( pa_sink_input * i , pa_usec_t * sink_latency ) ;
2004-06-08 23:54:24 +00:00
2011-02-14 13:41:06 +02:00
pa_bool_t pa_sink_input_is_volume_readable ( pa_sink_input * i ) ;
2009-04-13 22:50:24 +02:00
void pa_sink_input_set_volume ( pa_sink_input * i , const pa_cvolume * volume , pa_bool_t save , pa_bool_t absolute ) ;
pa_cvolume * pa_sink_input_get_volume ( pa_sink_input * i , pa_cvolume * volume , pa_bool_t absolute ) ;
2009-01-27 23:35:55 +01:00
void pa_sink_input_set_mute ( pa_sink_input * i , pa_bool_t mute , pa_bool_t save ) ;
2008-06-20 22:32:41 +02:00
pa_bool_t pa_sink_input_get_mute ( pa_sink_input * i ) ;
2009-04-13 22:50:24 +02:00
2009-02-05 04:07:27 +01:00
void pa_sink_input_update_proplist ( pa_sink_input * i , pa_update_mode_t mode , pa_proplist * p ) ;
2004-08-15 13:15:51 +00:00
2006-01-27 16:25:31 +00:00
pa_resample_method_t pa_sink_input_get_resample_method ( pa_sink_input * i ) ;
2004-11-20 16:23:53 +00:00
2009-02-12 03:18:05 +01:00
void pa_sink_input_send_event ( pa_sink_input * i , const char * name , pa_proplist * data ) ;
2009-01-27 23:35:55 +01:00
int pa_sink_input_move_to ( pa_sink_input * i , pa_sink * dest , pa_bool_t save ) ;
2009-01-23 22:38:30 +01:00
pa_bool_t pa_sink_input_may_move ( pa_sink_input * i ) ; /* may this sink input move at all? */
pa_bool_t pa_sink_input_may_move_to ( pa_sink_input * i , pa_sink * dest ) ; /* may this sink input move to this sink? */
/* The same as pa_sink_input_move_to() but in two seperate steps,
* first the detaching from the old sink , then the attaching to the
* new sink */
int pa_sink_input_start_move ( pa_sink_input * i ) ;
2009-01-27 23:35:55 +01:00
int pa_sink_input_finish_move ( pa_sink_input * i , pa_sink * dest , pa_bool_t save ) ;
2009-08-15 00:03:50 +02:00
void pa_sink_input_fail_move ( pa_sink_input * i ) ;
2006-07-29 15:06:49 +00:00
2007-10-28 19:13:50 +00:00
pa_sink_input_state_t pa_sink_input_get_state ( pa_sink_input * i ) ;
2008-05-15 23:34:41 +00:00
pa_usec_t pa_sink_input_get_requested_latency ( pa_sink_input * i ) ;
/* To be used exclusively by the sink driver IO thread */
2007-10-28 19:13:50 +00:00
2009-02-03 03:14:20 +01:00
void pa_sink_input_peek ( pa_sink_input * i , size_t length , pa_memchunk * chunk , pa_cvolume * volume ) ;
2007-10-28 19:13:50 +00:00
void pa_sink_input_drop ( pa_sink_input * i , size_t length ) ;
2008-05-15 23:34:41 +00:00
void pa_sink_input_process_rewind ( pa_sink_input * i , size_t nbytes /* in the sink's sample spec */ ) ;
void pa_sink_input_update_max_rewind ( pa_sink_input * i , size_t nbytes /* in the sink's sample spec */ ) ;
2008-06-20 22:32:41 +02:00
void pa_sink_input_update_max_request ( pa_sink_input * i , size_t nbytes /* in the sink's sample spec */ ) ;
2008-05-15 23:34:41 +00:00
void pa_sink_input_set_state_within_thread ( pa_sink_input * i , pa_sink_input_state_t state ) ;
2007-10-28 19:13:50 +00:00
int pa_sink_input_process_msg ( pa_msgobject * o , int code , void * userdata , int64_t offset , pa_memchunk * chunk ) ;
2008-05-15 23:34:41 +00:00
pa_usec_t pa_sink_input_set_requested_latency_within_thread ( pa_sink_input * i , pa_usec_t usec ) ;
pa_bool_t pa_sink_input_safe_to_remove ( pa_sink_input * i ) ;
pa_memchunk * pa_sink_input_get_silence ( pa_sink_input * i , pa_memchunk * ret ) ;
2007-10-28 19:13:50 +00:00
2009-08-13 02:14:19 +02:00
# define pa_sink_input_assert_io_context(s) \
pa_assert ( pa_thread_mq_get ( ) | | ! PA_SINK_INPUT_IS_LINKED ( ( s ) - > state ) )
2004-06-08 23:54:24 +00:00
# endif