PipeWire 1.1.0
Loading...
Searching...
No Matches
loop.h
Go to the documentation of this file.
1/* Simple Plugin API */
2/* SPDX-FileCopyrightText: Copyright © 2018 Wim Taymans */
3/* SPDX-License-Identifier: MIT */
4
5#ifndef SPA_LOOP_H
6#define SPA_LOOP_H
7
8#ifdef __cplusplus
9extern "C" {
10#endif
11
12#include <spa/utils/defs.h>
13#include <spa/utils/hook.h>
14#include <spa/support/system.h>
15
25#define SPA_TYPE_INTERFACE_Loop SPA_TYPE_INFO_INTERFACE_BASE "Loop"
26#define SPA_TYPE_INTERFACE_DataLoop SPA_TYPE_INFO_INTERFACE_BASE "DataLoop"
27#define SPA_VERSION_LOOP 0
28struct spa_loop { struct spa_interface iface; };
29
30#define SPA_TYPE_INTERFACE_LoopControl SPA_TYPE_INFO_INTERFACE_BASE "LoopControl"
31#define SPA_VERSION_LOOP_CONTROL 1
32struct spa_loop_control { struct spa_interface iface; };
34#define SPA_TYPE_INTERFACE_LoopUtils SPA_TYPE_INFO_INTERFACE_BASE "LoopUtils"
35#define SPA_VERSION_LOOP_UTILS 0
37
38struct spa_source;
40typedef void (*spa_source_func_t) (struct spa_source *source);
42struct spa_source {
43 struct spa_loop *loop;
45 void *data;
46 int fd;
47 uint32_t mask;
48 uint32_t rmask;
49 /* private data for the loop implementer */
50 void *priv;
51};
52
53typedef int (*spa_invoke_func_t) (struct spa_loop *loop,
54 bool async,
55 uint32_t seq,
56 const void *data,
57 size_t size,
58 void *user_data);
64 /* the version of this structure. This can be used to expand this
65 * structure in the future */
66#define SPA_VERSION_LOOP_METHODS 0
67 uint32_t version;
68
75 int (*add_source) (void *object,
76 struct spa_source *source);
77
84 int (*update_source) (void *object,
85 struct spa_source *source);
86
93 int (*remove_source) (void *object,
94 struct spa_source *source);
95
120 int (*invoke) (void *object,
122 uint32_t seq,
123 const void *data,
124 size_t size,
125 bool block,
126 void *user_data);
127};
128
129#define spa_loop_method(o,method,version,...) \
130({ \
131 int _res = -ENOTSUP; \
132 struct spa_loop *_o = o; \
133 spa_interface_call_res(&_o->iface, \
134 struct spa_loop_methods, _res, \
135 method, version, ##__VA_ARGS__); \
136 _res; \
137})
138
139#define spa_loop_add_source(l,...) spa_loop_method(l,add_source,0,##__VA_ARGS__)
140#define spa_loop_update_source(l,...) spa_loop_method(l,update_source,0,##__VA_ARGS__)
141#define spa_loop_remove_source(l,...) spa_loop_method(l,remove_source,0,##__VA_ARGS__)
142#define spa_loop_invoke(l,...) spa_loop_method(l,invoke,0,##__VA_ARGS__)
144
149#define SPA_VERSION_LOOP_CONTROL_HOOKS 0
150 uint32_t version;
153 void (*before) (void *data);
156 void (*after) (void *data);
157};
159#define spa_loop_control_hook_before(l) \
160({ \
161 struct spa_hook_list *_l = l; \
162 struct spa_hook *_h; \
163 spa_list_for_each_reverse(_h, &_l->list, link) \
164 spa_callbacks_call_fast(&_h->cb, struct spa_loop_control_hooks, before, 0); \
165})
166
167#define spa_loop_control_hook_after(l) \
168({ \
169 struct spa_hook_list *_l = l; \
170 struct spa_hook *_h; \
171 spa_list_for_each(_h, &_l->list, link) \
172 spa_callbacks_call_fast(&_h->cb, struct spa_loop_control_hooks, after, 0); \
174
179 /* the version of this structure. This can be used to expand this
180 * structure in the future */
181#define SPA_VERSION_LOOP_CONTROL_METHODS 1
182 uint32_t version;
183
184 int (*get_fd) (void *object);
185
192 void (*add_hook) (void *object,
193 struct spa_hook *hook,
194 const struct spa_loop_control_hooks *hooks,
195 void *data);
196
204 void (*enter) (void *object);
211 void (*leave) (void *object);
212
222 int (*iterate) (void *object, int timeout);
223
232 int (*check) (void *object);
233};
234
235#define spa_loop_control_method_v(o,method,version,...) \
236({ \
237 struct spa_loop_control *_o = o; \
238 spa_interface_call(&_o->iface, \
239 struct spa_loop_control_methods, \
240 method, version, ##__VA_ARGS__); \
241})
242
243#define spa_loop_control_method_r(o,method,version,...) \
244({ \
245 int _res = -ENOTSUP; \
246 struct spa_loop_control *_o = o; \
247 spa_interface_call_res(&_o->iface, \
248 struct spa_loop_control_methods, _res, \
249 method, version, ##__VA_ARGS__); \
250 _res; \
251})
252
253#define spa_loop_control_method_fast_r(o,method,version,...) \
254({ \
255 int _res; \
256 struct spa_loop_control *_o = o; \
257 spa_interface_call_fast_res(&_o->iface, \
258 struct spa_loop_control_methods, _res, \
259 method, version, ##__VA_ARGS__); \
260 _res; \
261})
262
263#define spa_loop_control_get_fd(l) spa_loop_control_method_r(l,get_fd,0)
264#define spa_loop_control_add_hook(l,...) spa_loop_control_method_v(l,add_hook,0,__VA_ARGS__)
265#define spa_loop_control_enter(l) spa_loop_control_method_v(l,enter,0)
266#define spa_loop_control_leave(l) spa_loop_control_method_v(l,leave,0)
267#define spa_loop_control_iterate(l,...) spa_loop_control_method_r(l,iterate,0,__VA_ARGS__)
268#define spa_loop_control_check(l) spa_loop_control_method_r(l,check,1)
269
270#define spa_loop_control_iterate_fast(l,...) spa_loop_control_method_fast_r(l,iterate,0,__VA_ARGS__)
271
272typedef void (*spa_source_io_func_t) (void *data, int fd, uint32_t mask);
273typedef void (*spa_source_idle_func_t) (void *data);
274typedef void (*spa_source_event_func_t) (void *data, uint64_t count);
275typedef void (*spa_source_timer_func_t) (void *data, uint64_t expirations);
276typedef void (*spa_source_signal_func_t) (void *data, int signal_number);
282 /* the version of this structure. This can be used to expand this
283 * structure in the future */
284#define SPA_VERSION_LOOP_UTILS_METHODS 0
285 uint32_t version;
286
287 struct spa_source *(*add_io) (void *object,
288 int fd,
289 uint32_t mask,
290 bool close,
291 spa_source_io_func_t func, void *data);
293 int (*update_io) (void *object, struct spa_source *source, uint32_t mask);
294
295 struct spa_source *(*add_idle) (void *object,
296 bool enabled,
297 spa_source_idle_func_t func, void *data);
298 int (*enable_idle) (void *object, struct spa_source *source, bool enabled);
299
300 struct spa_source *(*add_event) (void *object,
301 spa_source_event_func_t func, void *data);
302 int (*signal_event) (void *object, struct spa_source *source);
303
304 struct spa_source *(*add_timer) (void *object,
305 spa_source_timer_func_t func, void *data);
306 int (*update_timer) (void *object,
307 struct spa_source *source,
308 struct timespec *value,
309 struct timespec *interval,
310 bool absolute);
311 struct spa_source *(*add_signal) (void *object,
312 int signal_number,
313 spa_source_signal_func_t func, void *data);
314
318 void (*destroy_source) (void *object, struct spa_source *source);
319};
320
321#define spa_loop_utils_method_v(o,method,version,...) \
322({ \
323 struct spa_loop_utils *_o = o; \
324 spa_interface_call(&_o->iface, \
325 struct spa_loop_utils_methods, \
326 method, version, ##__VA_ARGS__); \
327})
328
329#define spa_loop_utils_method_r(o,method,version,...) \
330({ \
331 int _res = -ENOTSUP; \
332 struct spa_loop_utils *_o = o; \
333 spa_interface_call_res(&_o->iface, \
334 struct spa_loop_utils_methods, _res, \
335 method, version, ##__VA_ARGS__); \
336 _res; \
337})
338#define spa_loop_utils_method_s(o,method,version,...) \
339({ \
340 struct spa_source *_res = NULL; \
341 struct spa_loop_utils *_o = o; \
342 spa_interface_call_res(&_o->iface, \
343 struct spa_loop_utils_methods, _res, \
344 method, version, ##__VA_ARGS__); \
345 _res; \
346})
347
348
349#define spa_loop_utils_add_io(l,...) spa_loop_utils_method_s(l,add_io,0,__VA_ARGS__)
350#define spa_loop_utils_update_io(l,...) spa_loop_utils_method_r(l,update_io,0,__VA_ARGS__)
351#define spa_loop_utils_add_idle(l,...) spa_loop_utils_method_s(l,add_idle,0,__VA_ARGS__)
352#define spa_loop_utils_enable_idle(l,...) spa_loop_utils_method_r(l,enable_idle,0,__VA_ARGS__)
353#define spa_loop_utils_add_event(l,...) spa_loop_utils_method_s(l,add_event,0,__VA_ARGS__)
354#define spa_loop_utils_signal_event(l,...) spa_loop_utils_method_r(l,signal_event,0,__VA_ARGS__)
355#define spa_loop_utils_add_timer(l,...) spa_loop_utils_method_s(l,add_timer,0,__VA_ARGS__)
356#define spa_loop_utils_update_timer(l,...) spa_loop_utils_method_r(l,update_timer,0,__VA_ARGS__)
357#define spa_loop_utils_add_signal(l,...) spa_loop_utils_method_s(l,add_signal,0,__VA_ARGS__)
358#define spa_loop_utils_destroy_source(l,...) spa_loop_utils_method_v(l,destroy_source,0,__VA_ARGS__)
359
364#ifdef __cplusplus
365} /* extern "C" */
366#endif
367
368#endif /* SPA_LOOP_H */
spa/utils/defs.h
void(* spa_source_timer_func_t)(void *data, uint64_t expirations)
Definition loop.h:311
void(* spa_source_event_func_t)(void *data, uint64_t count)
Definition loop.h:310
void(* spa_source_signal_func_t)(void *data, int signal_number)
Definition loop.h:312
void(* spa_source_idle_func_t)(void *data)
Definition loop.h:309
void(* spa_source_func_t)(struct spa_source *source)
Definition loop.h:53
int(* spa_invoke_func_t)(struct spa_loop *loop, bool async, uint32_t seq, const void *data, size_t size, void *user_data)
Definition loop.h:66
void(* spa_source_io_func_t)(void *data, int fd, uint32_t mask)
Definition loop.h:308
spa/utils/hook.h
A hook, contains the structure with functions and the data passed to the functions.
Definition hook.h:350
Definition hook.h:138
Control hooks.
Definition loop.h:170
void(* before)(void *data)
Executed right before waiting for events.
Definition loop.h:176
uint32_t version
Definition loop.h:173
void(* after)(void *data)
Executed right after waiting for events.
Definition loop.h:179
Control an event loop.
Definition loop.h:201
int(* get_fd)(void *object)
Definition loop.h:208
int(* iterate)(void *object, int timeout)
Perform one iteration of the loop.
Definition loop.h:246
void(* enter)(void *object)
Enter a loop.
Definition loop.h:228
void(* add_hook)(void *object, struct spa_hook *hook, const struct spa_loop_control_hooks *hooks, void *data)
Add a hook.
Definition loop.h:216
int(* check)(void *object)
Check context of the loop.
Definition loop.h:256
void(* leave)(void *object)
Leave a loop.
Definition loop.h:235
uint32_t version
Definition loop.h:206
Definition loop.h:42
struct spa_interface iface
Definition loop.h:42
Register sources and work items to an event loop.
Definition loop.h:76
int(* add_source)(void *object, struct spa_source *source)
Add a source to the loop.
Definition loop.h:89
int(* remove_source)(void *object, struct spa_source *source)
Remove a source from the loop.
Definition loop.h:107
int(* invoke)(void *object, spa_invoke_func_t func, uint32_t seq, const void *data, size_t size, bool block, void *user_data)
Invoke a function in the context of this loop.
Definition loop.h:134
int(* update_source)(void *object, struct spa_source *source)
Update the source io mask.
Definition loop.h:98
uint32_t version
Definition loop.h:81
Create sources for an event loop.
Definition loop.h:317
int(* update_io)(void *object, struct spa_source *source, uint32_t mask)
Definition loop.h:330
int(* enable_idle)(void *object, struct spa_source *source, bool enabled)
Definition loop.h:335
int(* signal_event)(void *object, struct spa_source *source)
Definition loop.h:339
int(* update_timer)(void *object, struct spa_source *source, struct timespec *value, struct timespec *interval, bool absolute)
Definition loop.h:343
void(* destroy_source)(void *object, struct spa_source *source)
destroy a source allocated with this interface.
Definition loop.h:355
uint32_t version
Definition loop.h:322
Definition loop.h:48
struct spa_interface iface
Definition loop.h:48
Definition loop.h:36
struct spa_interface iface
Definition loop.h:36
Definition loop.h:55
uint32_t rmask
Definition loop.h:61
void * data
Definition loop.h:58
void * priv
Definition loop.h:63
uint32_t mask
Definition loop.h:60
spa_source_func_t func
Definition loop.h:57
int fd
Definition loop.h:59
struct spa_loop * loop
Definition loop.h:56
spa/support/system.h