[pulseaudio-discuss] [PATCH v2] module-jack-sink/source: Set fixed latency correctly on creation

David Henningsson david.henningsson at canonical.com
Wed Mar 28 04:32:53 PDT 2012


On 03/26/2012 11:12 PM, Maarten Lankhorst wrote:
> Changes since v1:
> Use max value of jack_port_get_latency_range to calculate the latency
> and squash compiler warnings cased by using jack_port_get_total_latency
>
> Modifying latency only works inside a callback, and for hardware the
> latency is generally fixed on jack, so just take the max value.

Looks good. I did a quick test with a jack sink and nothing seemed to 
have broken, so I've pushed your patch now.

Thanks!

>
> Signed-off-by: Maarten Lankhorst<m.b.lankhorst at gmail.com>
>
> ---
>
> diff --git a/src/modules/jack/module-jack-sink.c b/src/modules/jack/module-jack-sink.c
> index ba4ea95..017fbf6 100644
> --- a/src/modules/jack/module-jack-sink.c
> +++ b/src/modules/jack/module-jack-sink.c
> @@ -168,10 +168,12 @@ static int sink_process_msg(pa_msgobject *o, int code, void *data, int64_t offse
>
>           case PA_SINK_MESSAGE_GET_LATENCY: {
>               jack_nframes_t l, ft, d;
> +            jack_latency_range_t r;
>               size_t n;
>
>               /* This is the "worst-case" latency */
> -            l = jack_port_get_total_latency(u->client, u->port[0]) + u->frames_in_buffer;
> +            jack_port_get_latency_range(u->port[0], JackPlaybackLatency,&r);
> +            l = r.max + u->frames_in_buffer;
>
>               if (u->saved_frame_time_valid) {
>                   /* Adjust the worst case latency by the time that
> @@ -296,6 +298,8 @@ int pa__init(pa_module*m) {
>       unsigned i;
>       const char **ports = NULL, **p;
>       pa_sink_new_data data;
> +    jack_latency_range_t r;
> +    size_t n;
>
>       pa_assert(m);
>
> @@ -443,6 +447,9 @@ int pa__init(pa_module*m) {
>           }
>       }
>
> +    jack_port_get_latency_range(u->port[0], JackPlaybackLatency,&r);
> +    n = r.max * pa_frame_size(&u->sink->sample_spec);
> +    pa_sink_set_fixed_latency(u->sink, pa_bytes_to_usec(n,&u->sink->sample_spec));
>       pa_sink_put(u->sink);
>
>       if (ports)
> diff --git a/src/modules/jack/module-jack-source.c b/src/modules/jack/module-jack-source.c
> index 13109f3..cf62882 100644
> --- a/src/modules/jack/module-jack-source.c
> +++ b/src/modules/jack/module-jack-source.c
> @@ -124,11 +124,13 @@ static int source_process_msg(pa_msgobject *o, int code, void *data, int64_t off
>               return 0;
>
>           case PA_SOURCE_MESSAGE_GET_LATENCY: {
> +            jack_latency_range_t r;
>               jack_nframes_t l, ft, d;
>               size_t n;
>
>               /* This is the "worst-case" latency */
> -            l = jack_port_get_total_latency(u->client, u->port[0]);
> +            jack_port_get_latency_range(u->port[0], JackCaptureLatency,&r);
> +            l = r.max;
>
>               if (u->saved_frame_time_valid) {
>                   /* Adjust the worst case latency by the time that
> @@ -249,6 +251,8 @@ int pa__init(pa_module*m) {
>       unsigned i;
>       const char **ports = NULL, **p;
>       pa_source_new_data data;
> +    jack_latency_range_t r;
> +    size_t n;
>
>       pa_assert(m);
>
> @@ -388,6 +392,9 @@ int pa__init(pa_module*m) {
>
>       }
>
> +    jack_port_get_latency_range(u->port[0], JackCaptureLatency,&r);
> +    n = r.max * pa_frame_size(&u->source->sample_spec);
> +    pa_source_set_fixed_latency(u->source, pa_bytes_to_usec(n,&u->source->sample_spec));
>       pa_source_put(u->source);
>
>       if (ports)
>
>



-- 
David Henningsson, Canonical Ltd.
http://launchpad.net/~diwic


More information about the pulseaudio-discuss mailing list