diff options
author | Lennart Poettering <lennart@poettering.net> | 2007-06-11 12:08:37 +0000 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2007-06-11 12:08:37 +0000 |
commit | 00da37f2c448096cdd54481b072db47b2f253141 (patch) | |
tree | cb6c51231fa498831b3e63660105ec00ea98d8f5 /src/pulsecore/source.h | |
parent | 6aeec56708f4af2da0b83fdd65a0d153b9bed272 (diff) |
Merge HUGE set of changes temporarily into a branch, to allow me to move them from one machine to another (lock-free and stuff)
git-svn-id: file:///home/lennart/svn/public/pulseaudio/branches/lennart@1469 fefdeb5f-60dc-0310-8127-8f9354f1896f
Diffstat (limited to 'src/pulsecore/source.h')
-rw-r--r-- | src/pulsecore/source.h | 106 |
1 files changed, 72 insertions, 34 deletions
diff --git a/src/pulsecore/source.h b/src/pulsecore/source.h index 5a28cf4b..1e20c6e1 100644 --- a/src/pulsecore/source.h +++ b/src/pulsecore/source.h @@ -1,5 +1,5 @@ -#ifndef foosourcehfoo -#define foosourcehfoo +#ifndef foopulsesourcehfoo +#define foopulsesourcehfoo /* $Id$ */ @@ -32,6 +32,7 @@ typedef struct pa_source pa_source; #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> @@ -39,24 +40,30 @@ typedef struct pa_source pa_source; #include <pulsecore/memchunk.h> #include <pulsecore/sink.h> #include <pulsecore/module.h> +#include <pulsecore/asyncmsgq.h> +#include <pulsecore/msgobject.h> -#define PA_MAX_OUTPUTS_PER_SOURCE 16 +#define PA_MAX_OUTPUTS_PER_SOURCE 32 typedef enum pa_source_state { PA_SOURCE_RUNNING, + PA_SOURCE_SUSPENDED, + PA_SOURCE_IDLE, PA_SOURCE_DISCONNECTED } pa_source_state_t; struct pa_source { - int ref; + pa_msgobject parent; + uint32_t index; pa_core *core; - pa_source_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; @@ -64,48 +71,79 @@ struct pa_source { pa_idxset *outputs; pa_sink *monitor_of; /* may be NULL */ - pa_cvolume hw_volume, sw_volume; - int hw_muted, sw_muted; - - int is_hardware; - - void (*notify)(pa_source*source); /* may be NULL */ + pa_cvolume volume; + int muted; + int refresh_volume; + int referesh_mute; + + void (*start)(pa_source*source); /* may be NULL */ + void (*stop)(pa_source*source); /* may be NULL */ + int (*set_volume)(pa_source *s); /* dito */ + int (*get_volume)(pa_source *s); /* dito */ + int (*set_mute)(pa_source *s); /* dito */ + int (*get_mute)(pa_source *s); /* dito */ pa_usec_t (*get_latency)(pa_source *s); /* dito */ - int (*set_hw_volume)(pa_source *s); /* dito */ - int (*get_hw_volume)(pa_source *s); /* dito */ - int (*set_hw_mute)(pa_source *s); /* dito */ - int (*get_hw_mute)(pa_source *s); /* dito */ + pa_asyncmsgq *asyncmsgq; + + struct { + pa_hashmap *outputs; + pa_cvolume soft_volume; + int soft_muted; + } thread_info; + void *userdata; }; +PA_DECLARE_CLASS(pa_source); +#define PA_SOURCE(s) ((pa_source*) (s)) + +typedef enum pa_source_message { + PA_SOURCE_MESSAGE_ADD_OUTPUT, + PA_SOURCE_MESSAGE_REMOVE_OUTPUT, + PA_SOURCE_MESSAGE_GET_VOLUME, + PA_SOURCE_MESSAGE_SET_VOLUME, + PA_SOURCE_MESSAGE_GET_MUTE, + PA_SOURCE_MESSAGE_SET_MUTE, + PA_SOURCE_MESSAGE_GET_LATENCY, + PA_SOURCE_MESSAGE_START, + PA_SOURCE_MESSAGE_STOP, + PA_SOURCE_MESSAGE_MAX +} pa_source_message_t; + +/* To be used exclusively by the source driver */ + pa_source* pa_source_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_source_disconnect(pa_source *s); -void pa_source_unref(pa_source *s); -pa_source* pa_source_ref(pa_source *c); -/* Pass a new memory block to all output streams */ -void pa_source_post(pa_source*s, const pa_memchunk *b); - -void pa_source_notify(pa_source *s); +void pa_source_set_module(pa_source *s, pa_module *m); +void pa_source_set_description(pa_source *s, const char *description); -void pa_source_set_owner(pa_source *s, pa_module *m); +/* Callable by everyone */ pa_usec_t pa_source_get_latency(pa_source *s); -void pa_source_set_volume(pa_source *source, pa_mixer_t m, const pa_cvolume *volume); -const pa_cvolume *pa_source_get_volume(pa_source *source, pa_mixer_t m); -void pa_source_set_mute(pa_source *source, pa_mixer_t m, int mute); -int pa_source_get_mute(pa_source *source, pa_mixer_t m); +void pa_source_update_status(pa_source*s); +void pa_source_suspend(pa_source *s); -void pa_source_set_description(pa_source *s, const char *description); +void pa_source_set_volume(pa_source *source, const pa_cvolume *volume); +const pa_cvolume *pa_source_get_volume(pa_source *source); +void pa_source_set_mute(pa_source *source, int mute); +int pa_source_get_mute(pa_source *source); unsigned pa_source_used_by(pa_source *s); +#define pa_source_get_state(s) ((pa_source_state_t) pa_atomic_load(&(s)->state)) + +/* To be used exclusively by the source driver thread */ + +void pa_source_post(pa_source*s, const pa_memchunk *b); +void pa_source_process_msg(pa_msgobject *o, int code, void *userdata, pa_memchunk *chunk); + #endif |