summaryrefslogtreecommitdiffstats
path: root/src/pulsecore/source-output.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/pulsecore/source-output.h')
-rw-r--r--src/pulsecore/source-output.h74
1 files changed, 65 insertions, 9 deletions
diff --git a/src/pulsecore/source-output.h b/src/pulsecore/source-output.h
index 88de4ae6..4bcddbaf 100644
--- a/src/pulsecore/source-output.h
+++ b/src/pulsecore/source-output.h
@@ -86,10 +86,26 @@ struct pa_source_output {
pa_channel_map channel_map;
pa_format_info *format;
- /* if TRUE then the source we are connected to 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;
+ 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;
pa_resample_method_t requested_resample_method, actual_resample_method;
@@ -118,7 +134,10 @@ struct pa_source_output {
void (*update_source_fixed_latency) (pa_source_output *i); /* may be NULL */
/* If non-NULL this function is called when the output is first
- * connected to a source. Called from IO thread context */
+ * 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 */
void (*attach) (pa_source_output *o); /* may be NULL */
/* If non-NULL this function is called when the output is
@@ -134,9 +153,9 @@ struct pa_source_output {
void (*suspend_within_thread) (pa_source_output *o, pa_bool_t b); /* may be NULL */
/* If non-NULL called whenever the source output is moved to a new
- * source. Called from main context after the stream was detached
- * from the old source and before it is attached to the new
- * source. If dest is NULL the move was executed in two
+ * 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
* phases and the second one failed; the stream will be destroyed
* after this call. */
void (*moving) (pa_source_output *o, pa_source *dest); /* may be NULL */
@@ -164,9 +183,20 @@ struct pa_source_output {
* control events. */
void (*send_event)(pa_source_output *o, const char *event, pa_proplist* data);
+ /* 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 */
+
struct {
pa_source_output_state_t state;
+ pa_cvolume soft_volume;
+ pa_bool_t muted:1;
+
pa_bool_t attached:1; /* True only between ->attach() and ->detach() calls */
pa_sample_spec sample_spec;
@@ -177,6 +207,8 @@ struct pa_source_output {
* don't implement rewind() */
pa_memblockq *delay_memblockq;
+ pa_source_output *sync_prev, *sync_next;
+
/* The requested latency for the source */
pa_usec_t requested_source_latency;
@@ -195,6 +227,8 @@ enum {
PA_SOURCE_OUTPUT_MESSAGE_SET_STATE,
PA_SOURCE_OUTPUT_MESSAGE_SET_REQUESTED_LATENCY,
PA_SOURCE_OUTPUT_MESSAGE_GET_REQUESTED_LATENCY,
+ PA_SOURCE_OUTPUT_MESSAGE_SET_SOFT_VOLUME,
+ PA_SOURCE_OUTPUT_MESSAGE_SET_SOFT_MUTE,
PA_SOURCE_OUTPUT_MESSAGE_MAX
};
@@ -219,22 +253,38 @@ typedef struct pa_source_output_new_data {
pa_resample_method_t resample_method;
+ pa_source_output *sync_base;
+
pa_sample_spec sample_spec;
pa_channel_map channel_map;
pa_format_info *format;
pa_idxset *req_formats;
pa_idxset *nego_formats;
+ pa_cvolume volume, volume_factor, volume_factor_source;
+ pa_bool_t muted:1;
+
pa_bool_t sample_spec_is_set:1;
pa_bool_t channel_map_is_set:1;
- pa_bool_t save_source:1;
+ 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;
} pa_source_output_new_data;
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);
pa_bool_t pa_source_output_new_data_is_passthrough(pa_source_output_new_data *data);
+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);
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);
void pa_source_output_new_data_done(pa_source_output_new_data *data);
@@ -266,7 +316,13 @@ void pa_source_output_kill(pa_source_output*o);
pa_usec_t pa_source_output_get_latency(pa_source_output *o, pa_usec_t *source_latency);
+pa_bool_t pa_source_output_is_volume_readable(pa_source_output *o);
pa_bool_t pa_source_output_is_passthrough(pa_source_output *o);
+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);
void pa_source_output_update_proplist(pa_source_output *o, pa_update_mode_t mode, pa_proplist *p);