[pulseaudio-discuss] [PATCH 1/4] device-port: Add a latency variable to the port struct

Tanu Kaskinen tanuk at iki.fi
Tue Jun 19 09:19:17 PDT 2012


On Sun, 2012-06-17 at 14:47 +0200, poljar (Damir Jelic) wrote:
> From: poljar <poljarinho at gmail.com>
> 
> A latency offset variable was added to the port struct and functions to
> for handling a custom latency.
> 
> We can now attach a latency to the port which will be added to the
> sink/source latency if the port is active.
> ---
>  src/pulsecore/device-port.c |   34 ++++++++++++++++++++++++++++++++++
>  src/pulsecore/device-port.h |    6 ++++++
>  2 files changed, 40 insertions(+)
> 
> diff --git a/src/pulsecore/device-port.c b/src/pulsecore/device-port.c
> index 5870913..c5639b8 100644
> --- a/src/pulsecore/device-port.c
> +++ b/src/pulsecore/device-port.c
> @@ -97,6 +97,7 @@ pa_device_port *pa_device_port_new(pa_core *c, const char *name, const char *des
>      p->profiles = pa_hashmap_new(pa_idxset_string_hash_func, pa_idxset_string_compare_func);
>      p->is_input = FALSE;
>      p->is_output = FALSE;
> +    p->latency_offset = 0;
>      p->proplist = pa_proplist_new();
>  
>      return p;
> @@ -112,3 +113,36 @@ void pa_device_port_hashmap_free(pa_hashmap *h) {
>  
>      pa_hashmap_free(h, NULL, NULL);
>  }
> +
> +void pa_device_port_set_latency_offset(pa_device_port *p, pa_usec_t latency) {

I think "offset" would be a more descriptive parameter name than
"latency", because the offset is not really a stand-alone latency value.

> +    uint32_t state;
> +    union {
> +        pa_sink *sink;
> +        pa_source *source;
> +    } data;
> +
> +    pa_assert(p);
> +
> +    p->latency_offset = latency;
> +
> +    if (p->is_output) {

The sink pointer could be declared here, because it's not used outside
this if block. That would avoid the need for the union.

> +        PA_IDXSET_FOREACH(data.sink, p->core->sinks, state)
> +            if (data.sink->active_port == p) {
> +                pa_sink_set_latency_offset(data.sink, p->latency_offset);

It would be good to keep the code compilable in each patch. Here
pa_sink_set_latency_offset() is used before it exists, so the
compilation breaks. This matters at least when doing bisecting.

Maybe the most straight-forward way of fixing this would be to squash
the three first patches together.

> +                break;
> +            }
> +
> +    } else {
> +        PA_IDXSET_FOREACH(data.source, p->core->sources, state)
> +            if (data.source->active_port == p) {
> +                pa_source_set_latency_offset(data.source, p->latency_offset);
> +                break;
> +        }

Misaligned closing bracket.

> +    }
> +}
> +
> +pa_usec_t pa_device_port_get_latency_offset(pa_device_port *p) {
> +    pa_assert(p);
> +
> +    return p->latency_offset;
> +}

We tend not to have trivial getter functions in the server-side APIs,
unless the struct definition is hidden (pa_device_port definition is not
hidden). Trivial setter functions are fine, at least in my opinion, and
I even recommend using them (I don't like when component state is
directly changed from code outside that component).

-- 
Tanu



More information about the pulseaudio-discuss mailing list