PipeWire  0.3.66
latency-utils.h
Go to the documentation of this file.
1 /* Simple Plugin API */
2 /* SPDX-FileCopyrightText: Copyright © 2021 Wim Taymans */
3 /* SPDX-License-Identifier: MIT */
4 
5 #ifndef SPA_PARAM_LATENCY_UTILS_H
6 #define SPA_PARAM_LATENCY_UTILS_H
7 
8 #ifdef __cplusplus
9 extern "C" {
10 #endif
11 
17 #include <float.h>
18 
19 #include <spa/pod/builder.h>
20 #include <spa/pod/parser.h>
21 #include <spa/param/latency.h>
22 
23 static inline int
25 {
26  if (a->min_quantum == b->min_quantum &&
27  a->max_quantum == b->max_quantum &&
28  a->min_rate == b->min_rate &&
29  a->max_rate == b->max_rate &&
30  a->min_ns == b->min_ns &&
31  a->max_ns == b->max_ns)
32  return 0;
33  return 1;
34 }
35 
36 static inline void
38 {
39  *info = SPA_LATENCY_INFO(direction,
40  .min_quantum = FLT_MAX,
41  .max_quantum = 0.0f,
42  .min_rate = UINT32_MAX,
43  .max_rate = 0,
44  .min_ns = UINT64_MAX,
45  .max_ns = 0);
46 }
47 static inline void
49 {
50  if (info->min_quantum == FLT_MAX)
51  info->min_quantum = 0;
52  if (info->min_rate == UINT32_MAX)
53  info->min_rate = 0;
54  if (info->min_ns == UINT64_MAX)
55  info->min_ns = 0;
56 }
57 
58 static inline int
59 spa_latency_info_combine(struct spa_latency_info *info, const struct spa_latency_info *other)
60 {
61  if (info->direction != other->direction)
62  return -EINVAL;
63  if (other->min_quantum < info->min_quantum)
64  info->min_quantum = other->min_quantum;
65  if (other->max_quantum > info->max_quantum)
66  info->max_quantum = other->max_quantum;
67  if (other->min_rate < info->min_rate)
68  info->min_rate = other->min_rate;
69  if (other->max_rate > info->max_rate)
70  info->max_rate = other->max_rate;
71  if (other->min_ns < info->min_ns)
72  info->min_ns = other->min_ns;
73  if (other->max_ns > info->max_ns)
74  info->max_ns = other->max_ns;
75  return 0;
76 }
77 
78 static inline int
79 spa_latency_parse(const struct spa_pod *latency, struct spa_latency_info *info)
80 {
81  int res;
82  spa_zero(*info);
83  if ((res = spa_pod_parse_object(latency,
92  return res;
93  info->direction = (enum spa_direction)(info->direction & 1);
94  return 0;
95 }
96 
97 static inline struct spa_pod *
98 spa_latency_build(struct spa_pod_builder *builder, uint32_t id, const struct spa_latency_info *info)
99 {
100  return (struct spa_pod *)spa_pod_builder_add_object(builder,
109 }
110 
111 static inline int
112 spa_process_latency_parse(const struct spa_pod *latency, struct spa_process_latency_info *info)
113 {
114  int res;
115  spa_zero(*info);
116  if ((res = spa_pod_parse_object(latency,
121  return res;
122  return 0;
123 }
124 
125 static inline struct spa_pod *
126 spa_process_latency_build(struct spa_pod_builder *builder, uint32_t id,
127  const struct spa_process_latency_info *info)
128 {
129  return (struct spa_pod *)spa_pod_builder_add_object(builder,
134 }
135 
136 static inline int
138  struct spa_latency_info *info)
139 {
140  info->min_quantum += process->quantum;
141  info->max_quantum += process->quantum;
142  info->min_rate += process->rate;
143  info->max_rate += process->rate;
144  info->min_ns += process->ns;
145  info->max_ns += process->ns;
146  return 0;
147 }
148 
153 #ifdef __cplusplus
154 } /* extern "C" */
155 #endif
156 
157 #endif /* SPA_PARAM_LATENCY_UTILS_H */
spa/pod/builder.h
static int spa_latency_info_compare(const struct spa_latency_info *a, struct spa_latency_info *b)
Definition: latency-utils.h:29
static int spa_latency_parse(const struct spa_pod *latency, struct spa_latency_info *info)
Definition: latency-utils.h:84
static int spa_latency_info_combine(struct spa_latency_info *info, const struct spa_latency_info *other)
Definition: latency-utils.h:64
static struct spa_pod * spa_process_latency_build(struct spa_pod_builder *builder, uint32_t id, const struct spa_process_latency_info *info)
Definition: latency-utils.h:131
#define SPA_LATENCY_INFO(dir,...)
Definition: latency.h:48
static int spa_process_latency_info_add(const struct spa_process_latency_info *process, struct spa_latency_info *info)
Definition: latency-utils.h:142
static struct spa_pod * spa_latency_build(struct spa_pod_builder *builder, uint32_t id, const struct spa_latency_info *info)
Definition: latency-utils.h:103
static int spa_process_latency_parse(const struct spa_pod *latency, struct spa_process_latency_info *info)
Definition: latency-utils.h:117
static void spa_latency_info_combine_finish(struct spa_latency_info *info)
Definition: latency-utils.h:53
static void spa_latency_info_combine_start(struct spa_latency_info *info, enum spa_direction direction)
Definition: latency-utils.h:42
@ SPA_PARAM_PROCESS_LATENCY_rate
latency (Int) relative to rate
Definition: latency.h:54
@ SPA_PARAM_PROCESS_LATENCY_ns
latency (Long) in nanoseconds
Definition: latency.h:55
@ SPA_PARAM_PROCESS_LATENCY_quantum
latency relative to quantum (Float)
Definition: latency.h:53
@ SPA_PARAM_LATENCY_maxNs
max latency (Long) in nanoseconds
Definition: latency.h:33
@ SPA_PARAM_LATENCY_minRate
min latency (Int) relative to rate
Definition: latency.h:30
@ SPA_PARAM_LATENCY_minQuantum
min latency relative to quantum (Float)
Definition: latency.h:28
@ SPA_PARAM_LATENCY_maxRate
max latency (Int) relative to rate
Definition: latency.h:31
@ SPA_PARAM_LATENCY_maxQuantum
max latency relative to quantum (Float)
Definition: latency.h:29
@ SPA_PARAM_LATENCY_direction
direction, input/output (Id enum spa_direction)
Definition: latency.h:27
@ SPA_PARAM_LATENCY_minNs
min latency (Long) in nanoseconds
Definition: latency.h:32
#define SPA_POD_OPT_Float(val)
Definition: parser.h:526
#define SPA_POD_Long(val)
Definition: vararg.h:65
#define SPA_POD_Id(val)
Definition: vararg.h:49
#define SPA_POD_OPT_Int(val)
Definition: parser.h:522
#define spa_pod_builder_add_object(b, type, id,...)
Definition: builder.h:659
#define SPA_POD_Float(val)
Definition: vararg.h:76
#define spa_pod_parse_object(pod, type, id,...)
Definition: parser.h:576
#define SPA_POD_Int(val)
Definition: vararg.h:54
#define SPA_POD_OPT_Long(val)
Definition: parser.h:524
@ SPA_TYPE_OBJECT_ParamLatency
Definition: spa/include/spa/utils/type.h:84
@ SPA_TYPE_OBJECT_ParamProcessLatency
Definition: spa/include/spa/utils/type.h:85
#define spa_zero(x)
Definition: defs.h:417
spa_direction
Definition: defs.h:92
spa/param/latency.h
spa/pod/parser.h
helper structure for managing latency objects
Definition: latency.h:37
uint32_t min_rate
Definition: latency.h:41
uint32_t max_rate
Definition: latency.h:42
enum spa_direction direction
Definition: latency.h:38
float max_quantum
Definition: latency.h:40
float min_quantum
Definition: latency.h:39
uint64_t min_ns
Definition: latency.h:43
uint64_t max_ns
Definition: latency.h:44
Definition: builder.h:53
Definition: pod/pod.h:43
Helper structure for managing process latency objects.
Definition: latency.h:59
float quantum
Definition: latency.h:60
uint32_t rate
Definition: latency.h:61
uint64_t ns
Definition: latency.h:62