[pulseaudio-discuss] [PATCH v2] core: Link virtual sinks and sources to their streams.

Tanu Kaskinen tanu.kaskinen at digia.com
Mon Feb 21 01:03:00 PST 2011


Ping?



On Mon, 2011-02-07 at 18:35 +0200, Kaskinen Tanu wrote:
> This change doesn't add any functionality in itself, but it will be useful in
> the future for operating on chains of sinks or sources that are piggy-backing
> on each other.
> 
> For example, the PA_PROP_DEVICE_MASTER_DEVICE property could
> be handled in the core so that each virtual device doesn't have to maintain it
> separately. By using the origin_sink and destination_source pointers the core
> is able to see at stream creation time that the stream is created by a virtual
> device, and then update that device's property list using the name of the
> master device that the stream is being connected to. The same thing can be done
> also when the stream is being moved from a device to another, in which case the
> _MASTER_DEVICE property needs updating.
> ---
>  src/modules/echo-cancel/module-echo-cancel.c |    6 ++++++
>  src/modules/module-equalizer-sink.c          |    4 +++-
>  src/modules/module-ladspa-sink.c             |    3 +++
>  src/modules/module-remap-sink.c              |    3 +++
>  src/modules/module-virtual-sink.c            |    3 +++
>  src/modules/module-virtual-source.c          |    3 +++
>  src/pulsecore/sink-input.c                   |    1 +
>  src/pulsecore/sink-input.h                   |    4 +++-
>  src/pulsecore/sink.c                         |    1 +
>  src/pulsecore/sink.h                         |    2 ++
>  src/pulsecore/source-output.c                |    1 +
>  src/pulsecore/source-output.h                |    4 +++-
>  src/pulsecore/source.c                       |    1 +
>  src/pulsecore/source.h                       |    1 +
>  14 files changed, 34 insertions(+), 3 deletions(-)
> 
> diff --git a/src/modules/echo-cancel/module-echo-cancel.c b/src/modules/echo-cancel/module-echo-cancel.c
> index 611ebb7..0108c31 100644
> --- a/src/modules/echo-cancel/module-echo-cancel.c
> +++ b/src/modules/echo-cancel/module-echo-cancel.c
> @@ -1502,6 +1502,7 @@ int pa__init(pa_module*m) {
>      source_output_data.driver = __FILE__;
>      source_output_data.module = m;
>      source_output_data.source = source_master;
> +    source_output_data.destination_source = u->source;
>      /* FIXME
>         source_output_data.flags = PA_SOURCE_OUTPUT_DONT_INHIBIT_AUTO_SUSPEND; */
>  
> @@ -1531,11 +1532,14 @@ int pa__init(pa_module*m) {
>      u->source_output->moving = source_output_moving_cb;
>      u->source_output->userdata = u;
>  
> +    u->source->output_from_master = u->source_output;
> +
>      /* Create sink input */
>      pa_sink_input_new_data_init(&sink_input_data);
>      sink_input_data.driver = __FILE__;
>      sink_input_data.module = m;
>      sink_input_data.sink = sink_master;
> +    sink_input_data.origin_sink = u->sink;
>      pa_proplist_sets(sink_input_data.proplist, PA_PROP_MEDIA_NAME, "Echo-Cancel Sink Stream");
>      pa_proplist_sets(sink_input_data.proplist, PA_PROP_MEDIA_ROLE, "filter");
>      pa_sink_input_new_data_set_sample_spec(&sink_input_data, &sink_ss);
> @@ -1566,6 +1570,8 @@ int pa__init(pa_module*m) {
>      u->sink_input->mute_changed = sink_input_mute_changed_cb;
>      u->sink_input->userdata = u;
>  
> +    u->sink->input_to_master = u->sink_input;
> +
>      pa_sink_input_get_silence(u->sink_input, &silence);
>  
>      u->source_memblockq = pa_memblockq_new(0, MEMBLOCKQ_MAXLENGTH, 0,
> diff --git a/src/modules/module-equalizer-sink.c b/src/modules/module-equalizer-sink.c
> index bc349ce..a28405b 100644
> --- a/src/modules/module-equalizer-sink.c
> +++ b/src/modules/module-equalizer-sink.c
> @@ -1200,6 +1200,7 @@ int pa__init(pa_module*m) {
>      sink_input_data.driver = __FILE__;
>      sink_input_data.module = m;
>      sink_input_data.sink = master;
> +    sink_input_data.origin_sink = u->sink;
>      pa_proplist_sets(sink_input_data.proplist, PA_PROP_MEDIA_NAME, "Equalized Stream");
>      pa_proplist_sets(sink_input_data.proplist, PA_PROP_MEDIA_ROLE, "filter");
>      pa_sink_input_new_data_set_sample_spec(&sink_input_data, &ss);
> @@ -1225,9 +1226,10 @@ int pa__init(pa_module*m) {
>      u->sink_input->moving = sink_input_moving_cb;
>      u->sink_input->volume_changed = sink_input_volume_changed_cb;
>      u->sink_input->mute_changed = sink_input_mute_changed_cb;
> -
>      u->sink_input->userdata = u;
>  
> +    u->sink->input_to_master = u->sink_input;
> +
>      dbus_init(u);
>  
>      /* default filter to these */
> diff --git a/src/modules/module-ladspa-sink.c b/src/modules/module-ladspa-sink.c
> index 88df67e..cdccf1a 100644
> --- a/src/modules/module-ladspa-sink.c
> +++ b/src/modules/module-ladspa-sink.c
> @@ -832,6 +832,7 @@ int pa__init(pa_module*m) {
>      sink_input_data.driver = __FILE__;
>      sink_input_data.module = m;
>      sink_input_data.sink = master;
> +    sink_input_data.origin_sink = u->sink;
>      pa_proplist_sets(sink_input_data.proplist, PA_PROP_MEDIA_NAME, "LADSPA Stream");
>      pa_proplist_sets(sink_input_data.proplist, PA_PROP_MEDIA_ROLE, "filter");
>      pa_sink_input_new_data_set_sample_spec(&sink_input_data, &ss);
> @@ -859,6 +860,8 @@ int pa__init(pa_module*m) {
>      u->sink_input->mute_changed = sink_input_mute_changed_cb;
>      u->sink_input->userdata = u;
>  
> +    u->sink->input_to_master = u->sink_input;
> +
>      pa_sink_put(u->sink);
>      pa_sink_input_put(u->sink_input);
>  
> diff --git a/src/modules/module-remap-sink.c b/src/modules/module-remap-sink.c
> index 43748bd..7f64f30 100644
> --- a/src/modules/module-remap-sink.c
> +++ b/src/modules/module-remap-sink.c
> @@ -420,6 +420,7 @@ int pa__init(pa_module*m) {
>      sink_input_data.driver = __FILE__;
>      sink_input_data.module = m;
>      sink_input_data.sink = master;
> +    sink_input_data.origin_sink = u->sink;
>      pa_proplist_sets(sink_input_data.proplist, PA_PROP_MEDIA_NAME, "Remapped Stream");
>      pa_proplist_sets(sink_input_data.proplist, PA_PROP_MEDIA_ROLE, "filter");
>      pa_sink_input_new_data_set_sample_spec(&sink_input_data, &ss);
> @@ -446,6 +447,8 @@ int pa__init(pa_module*m) {
>      u->sink_input->moving = sink_input_moving_cb;
>      u->sink_input->userdata = u;
>  
> +    u->sink->input_to_master = u->sink_input;
> +
>      pa_sink_put(u->sink);
>      pa_sink_input_put(u->sink_input);
>  
> diff --git a/src/modules/module-virtual-sink.c b/src/modules/module-virtual-sink.c
> index fac204d..40bab5a 100644
> --- a/src/modules/module-virtual-sink.c
> +++ b/src/modules/module-virtual-sink.c
> @@ -556,6 +556,7 @@ int pa__init(pa_module*m) {
>      sink_input_data.driver = __FILE__;
>      sink_input_data.module = m;
>      sink_input_data.sink = master;
> +    sink_input_data.origin_sink = u->sink;
>      pa_proplist_sets(sink_input_data.proplist, PA_PROP_MEDIA_NAME, "Virtual Sink Stream");
>      pa_proplist_sets(sink_input_data.proplist, PA_PROP_MEDIA_ROLE, "filter");
>      pa_sink_input_new_data_set_sample_spec(&sink_input_data, &ss);
> @@ -583,6 +584,8 @@ int pa__init(pa_module*m) {
>      u->sink_input->mute_changed = sink_input_mute_changed_cb;
>      u->sink_input->userdata = u;
>  
> +    u->sink->input_to_master = u->sink_input;
> +
>      /* (9) IF YOU REQUIRE A FIXED BLOCK SIZE MAKE SURE TO PASS A
>       * SILENCE MEMBLOCK AS LAST PARAMETER
>       * HERE. pa_sink_input_get_silence() IS USEFUL HERE. */
> diff --git a/src/modules/module-virtual-source.c b/src/modules/module-virtual-source.c
> index fdf89b0..a2b073f 100644
> --- a/src/modules/module-virtual-source.c
> +++ b/src/modules/module-virtual-source.c
> @@ -629,6 +629,7 @@ int pa__init(pa_module*m) {
>      source_output_data.driver = __FILE__;
>      source_output_data.module = m;
>      source_output_data.source = master;
> +    source_output_data.destination_source = u->source;
>      /* FIXME
>         source_output_data.flags = PA_SOURCE_OUTPUT_DONT_INHIBIT_AUTO_SUSPEND; */
>  
> @@ -654,6 +655,8 @@ int pa__init(pa_module*m) {
>      u->source_output->moving = source_output_moving_cb;
>      u->source_output->userdata = u;
>  
> +    u->source->output_from_master = u->source_output;
> +
>      pa_source_put(u->source);
>      pa_source_output_put(u->source_output);
>  
> diff --git a/src/pulsecore/sink-input.c b/src/pulsecore/sink-input.c
> index 065fd2d..00adc6d 100644
> --- a/src/pulsecore/sink-input.c
> +++ b/src/pulsecore/sink-input.c
> @@ -321,6 +321,7 @@ int pa_sink_input_new(
>      i->driver = pa_xstrdup(pa_path_get_filename(data->driver));
>      i->module = data->module;
>      i->sink = data->sink;
> +    i->origin_sink = data->origin_sink;
>      i->client = data->client;
>  
>      i->requested_resample_method = data->resample_method;
> diff --git a/src/pulsecore/sink-input.h b/src/pulsecore/sink-input.h
> index f81e2d4..e1991a2 100644
> --- a/src/pulsecore/sink-input.h
> +++ b/src/pulsecore/sink-input.h
> @@ -83,7 +83,8 @@ struct pa_sink_input {
>      pa_module *module;                  /* may be NULL */
>      pa_client *client;                  /* may be NULL */
>  
> -    pa_sink *sink; /* NULL while we are being moved */
> +    pa_sink *sink;                      /* NULL while we are being moved */
> +    pa_sink *origin_sink;               /* only set by filter sinks */
>  
>      /* A sink input may be connected to multiple source outputs
>       * directly, so that they don't get mixed data of the entire
> @@ -285,6 +286,7 @@ typedef struct pa_sink_input_new_data {
>      pa_client *client;
>  
>      pa_sink *sink;
> +    pa_sink *origin_sink;
>  
>      pa_resample_method_t resample_method;
>  
> diff --git a/src/pulsecore/sink.c b/src/pulsecore/sink.c
> index 62000e0..0de544c 100644
> --- a/src/pulsecore/sink.c
> +++ b/src/pulsecore/sink.c
> @@ -269,6 +269,7 @@ pa_sink* pa_sink_new(
>  
>      s->inputs = pa_idxset_new(NULL, NULL);
>      s->n_corked = 0;
> +    s->input_to_master = NULL;
>  
>      s->reference_volume = s->real_volume = data->volume;
>      pa_cvolume_reset(&s->soft_volume, s->sample_spec.channels);
> diff --git a/src/pulsecore/sink.h b/src/pulsecore/sink.h
> index 4d569dd..8a51587 100644
> --- a/src/pulsecore/sink.h
> +++ b/src/pulsecore/sink.h
> @@ -44,6 +44,7 @@ typedef struct pa_sink_volume_change pa_sink_volume_change;
>  #include <pulsecore/card.h>
>  #include <pulsecore/queue.h>
>  #include <pulsecore/thread-mq.h>
> +#include <pulsecore/sink-input.h>
>  
>  #define PA_MAX_INPUTS_PER_SINK 32
>  
> @@ -86,6 +87,7 @@ struct pa_sink {
>      pa_idxset *inputs;
>      unsigned n_corked;
>      pa_source *monitor_source;
> +    pa_sink_input *input_to_master;         /* non-NULL only for filter sinks */
>  
>      pa_volume_t base_volume; /* shall be constant */
>      unsigned n_volume_steps; /* shall be constant */
> diff --git a/src/pulsecore/source-output.c b/src/pulsecore/source-output.c
> index 88731e7..0bb8899 100644
> --- a/src/pulsecore/source-output.c
> +++ b/src/pulsecore/source-output.c
> @@ -208,6 +208,7 @@ int pa_source_output_new(
>      o->driver = pa_xstrdup(pa_path_get_filename(data->driver));
>      o->module = data->module;
>      o->source = data->source;
> +    o->destination_source = data->destination_source;
>      o->client = data->client;
>  
>      o->actual_resample_method = resampler ? pa_resampler_get_method(resampler) : PA_RESAMPLER_INVALID;
> diff --git a/src/pulsecore/source-output.h b/src/pulsecore/source-output.h
> index 273b78f..f16f952 100644
> --- a/src/pulsecore/source-output.h
> +++ b/src/pulsecore/source-output.h
> @@ -74,7 +74,8 @@ struct pa_source_output {
>      pa_module *module;                    /* may be NULL */
>      pa_client *client;                    /* may be NULL */
>  
> -    pa_source *source; /* NULL while being moved */
> +    pa_source *source;                    /* NULL while being moved */
> +    pa_source *destination_source;        /* only set by filter sources */
>  
>      /* 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 */
> @@ -211,6 +212,7 @@ typedef struct pa_source_output_new_data {
>      pa_client *client;
>  
>      pa_source *source;
> +    pa_source *destination_source;
>  
>      pa_resample_method_t resample_method;
>  
> diff --git a/src/pulsecore/source.c b/src/pulsecore/source.c
> index 412a3db..24d0ff6 100644
> --- a/src/pulsecore/source.c
> +++ b/src/pulsecore/source.c
> @@ -221,6 +221,7 @@ pa_source* pa_source_new(
>      s->outputs = pa_idxset_new(NULL, NULL);
>      s->n_corked = 0;
>      s->monitor_of = NULL;
> +    s->output_from_master = NULL;
>  
>      s->volume = data->volume;
>      pa_cvolume_reset(&s->soft_volume, s->sample_spec.channels);
> diff --git a/src/pulsecore/source.h b/src/pulsecore/source.h
> index e3e56bc..f3af159 100644
> --- a/src/pulsecore/source.h
> +++ b/src/pulsecore/source.h
> @@ -75,6 +75,7 @@ struct pa_source {
>      pa_idxset *outputs;
>      unsigned n_corked;
>      pa_sink *monitor_of;                     /* may be NULL */
> +    pa_source_output *output_from_master;    /* non-NULL only for filter sources */
>  
>      pa_volume_t base_volume; /* shall be constant */
>      unsigned n_volume_steps; /* shall be constant */




More information about the pulseaudio-discuss mailing list