diff options
Diffstat (limited to 'src/pulsecore/sink.h')
-rw-r--r-- | src/pulsecore/sink.h | 114 |
1 files changed, 78 insertions, 36 deletions
diff --git a/src/pulsecore/sink.h b/src/pulsecore/sink.h index ef73f67d..2939cc47 100644 --- a/src/pulsecore/sink.h +++ b/src/pulsecore/sink.h @@ -1,5 +1,5 @@ -#ifndef foosinkhfoo -#define foosinkhfoo +#ifndef foopulsesinkhfoo +#define foopulsesinkhfoo /* $Id$ */ @@ -25,37 +25,43 @@ USA. ***/ -#include <inttypes.h> - typedef struct pa_sink pa_sink; +#include <inttypes.h> + #include <pulse/sample.h> #include <pulse/channelmap.h> #include <pulse/volume.h> + #include <pulsecore/core-def.h> #include <pulsecore/core.h> #include <pulsecore/idxset.h> #include <pulsecore/source.h> #include <pulsecore/module.h> +#include <pulsecore/refcnt.h> +#include <pulsecore/msgobject.h> #define PA_MAX_INPUTS_PER_SINK 32 typedef enum pa_sink_state { PA_SINK_RUNNING, + PA_SINK_SUSPENDED, + PA_SINK_IDLE, PA_SINK_DISCONNECTED } pa_sink_state_t; struct pa_sink { - int ref; + pa_msgobject parent; + uint32_t index; pa_core *core; - pa_sink_state_t state; + pa_atomic_t state; char *name; char *description, *driver; /* may be NULL */ int is_hardware; - pa_module *owner; /* may be NULL */ + pa_module *module; /* may be NULL */ pa_sample_spec sample_spec; pa_channel_map channel_map; @@ -63,49 +69,85 @@ struct pa_sink { pa_idxset *inputs; pa_source *monitor_source; /* may be NULL */ - pa_cvolume hw_volume, sw_volume; - int hw_muted, sw_muted; - - void (*notify)(pa_sink*sink); /* may be NULL */ - pa_usec_t (*get_latency)(pa_sink *s); /* dito */ - int (*set_hw_volume)(pa_sink *s); /* dito */ - int (*get_hw_volume)(pa_sink *s); /* dito */ - int (*set_hw_mute)(pa_sink *s); /* dito */ - int (*get_hw_mute)(pa_sink *s); /* dito */ + pa_cvolume volume; + int muted; + int refresh_volume; + int refresh_mute; + + int (*start)(pa_sink *s); + int (*stop)(pa_sink *s); + int (*set_volume)(pa_sink *s); /* dito */ + int (*get_volume)(pa_sink *s); /* dito */ + int (*get_mute)(pa_sink *s); /* dito */ + int (*set_mute)(pa_sink *s); /* dito */ + pa_usec_t (*get_latency)(pa_sink *s); /* dito */ + + pa_asyncmsgq *asyncmsgq; + + /* Contains copies of the above data so that the real-time worker + * thread can work without access locking */ + struct { + pa_hashmap *inputs; + pa_cvolume soft_volume; + int soft_muted; + } thread_info; void *userdata; }; +PA_DECLARE_CLASS(pa_sink); +#define PA_SINK(s) ((pa_sink*) (s)) + +typedef enum pa_sink_message { + PA_SINK_MESSAGE_ADD_INPUT, + PA_SINK_MESSAGE_REMOVE_INPUT, + PA_SINK_MESSAGE_GET_VOLUME, + PA_SINK_MESSAGE_SET_VOLUME, + PA_SINK_MESSAGE_GET_MUTE, + PA_SINK_MESSAGE_SET_MUTE, + PA_SINK_MESSAGE_GET_LATENCY, + PA_SINK_MESSAGE_START, + PA_SINK_MESSAGE_STOP, + PA_SINK_MESSAGE_MAX +} pa_sink_message_t; + +/* To be used exclusively by the sink driver */ + pa_sink* pa_sink_new( - pa_core *core, - const char *driver, - const char *name, - int namereg_fail, - const pa_sample_spec *spec, - const pa_channel_map *map); + pa_core *core, + const char *driver, + const char *name, + int namereg_fail, + const pa_sample_spec *spec, + const pa_channel_map *map); void pa_sink_disconnect(pa_sink* s); -void pa_sink_unref(pa_sink*s); -pa_sink* pa_sink_ref(pa_sink *s); -int pa_sink_render(pa_sink*s, size_t length, pa_memchunk *result); -void pa_sink_render_full(pa_sink *s, size_t length, pa_memchunk *result); -int pa_sink_render_into(pa_sink*s, pa_memchunk *target); -void pa_sink_render_into_full(pa_sink *s, pa_memchunk *target); +void pa_sink_set_module(pa_sink *sink, pa_module *m); +void pa_sink_set_description(pa_sink *s, const char *description); + +/* Usable by everyone */ pa_usec_t pa_sink_get_latency(pa_sink *s); -void pa_sink_notify(pa_sink*s); +void pa_sink_update_status(pa_sink*s); +void pa_sink_suspend(pa_sink *s, int suspend); -void pa_sink_set_owner(pa_sink *sink, pa_module *m); +void pa_sink_set_volume(pa_sink *sink, const pa_cvolume *volume); +const pa_cvolume *pa_sink_get_volume(pa_sink *sink); +void pa_sink_set_mute(pa_sink *sink, int mute); +int pa_sink_get_mute(pa_sink *sink); -void pa_sink_set_volume(pa_sink *sink, pa_mixer_t m, const pa_cvolume *volume); -const pa_cvolume *pa_sink_get_volume(pa_sink *sink, pa_mixer_t m); -void pa_sink_set_mute(pa_sink *sink, pa_mixer_t m, int mute); -int pa_sink_get_mute(pa_sink *sink, pa_mixer_t m); +unsigned pa_sink_used_by(pa_sink *s); +#define pa_sink_get_state(s) ((pa_sink_state_t) pa_atomic_load(&(s)->state)) -void pa_sink_set_description(pa_sink *s, const char *description); +/* To be used exclusively by the sink driver thread */ -unsigned pa_sink_used_by(pa_sink *s); +int pa_sink_render(pa_sink*s, size_t length, pa_memchunk *result); +void pa_sink_render_full(pa_sink *s, size_t length, pa_memchunk *result); +int pa_sink_render_into(pa_sink*s, pa_memchunk *target); +void pa_sink_render_into_full(pa_sink *s, pa_memchunk *target); + +int pa_sink_process_msg(pa_msgobject *o, int code, void *userdata, pa_memchunk *chunk); #endif |