PipeWire  1.6.4
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 #include <errno.h>
9 
10 #include <spa/utils/defs.h>
11 #include <spa/utils/hook.h>
12 #include <spa/support/system.h>
13 
14 #ifdef __cplusplus
15 extern "C" {
16 #endif
17 
18 #ifndef SPA_API_LOOP
19  #ifdef SPA_API_IMPL
20  #define SPA_API_LOOP SPA_API_IMPL
21  #else
22  #define SPA_API_LOOP static inline
23  #endif
24 #endif
25 
35 #define SPA_TYPE_INTERFACE_Loop SPA_TYPE_INFO_INTERFACE_BASE "Loop"
36 #define SPA_TYPE_INTERFACE_DataLoop SPA_TYPE_INFO_INTERFACE_BASE "DataLoop"
37 #define SPA_VERSION_LOOP 0
38 struct spa_loop { struct spa_interface iface; };
39 
40 #define SPA_TYPE_INTERFACE_LoopControl SPA_TYPE_INFO_INTERFACE_BASE "LoopControl"
41 #define SPA_VERSION_LOOP_CONTROL 2
42 struct spa_loop_control { struct spa_interface iface; };
43 
44 #define SPA_TYPE_INTERFACE_LoopUtils SPA_TYPE_INFO_INTERFACE_BASE "LoopUtils"
45 #define SPA_VERSION_LOOP_UTILS 0
46 struct spa_loop_utils { struct spa_interface iface; };
47 
48 struct spa_source;
49 
50 typedef void (*spa_source_func_t) (struct spa_source *source);
51 
52 struct spa_source {
53  struct spa_loop *loop;
55  void *data;
56  int fd;
57  uint32_t mask;
58  uint32_t rmask;
59  /* private data for the loop implementer */
60  void *priv;
61 };
62 
63 typedef int (*spa_invoke_func_t) (struct spa_loop *loop,
64  bool async,
65  uint32_t seq,
66  const void *data,
67  size_t size,
68  void *user_data);
69 
74  /* the version of this structure. This can be used to expand this
75  * structure in the future */
76 #define SPA_VERSION_LOOP_METHODS 0
77  uint32_t version;
78 
85  int (*add_source) (void *object,
86  struct spa_source *source);
87 
94  int (*update_source) (void *object,
95  struct spa_source *source);
96 
103  int (*remove_source) (void *object,
104  struct spa_source *source);
105 
133  int (*invoke) (void *object,
135  uint32_t seq,
136  const void *data,
137  size_t size,
138  bool block,
139  void *user_data);
140 
152  int (*locked) (void *object,
154  uint32_t seq,
155  const void *data,
156  size_t size,
157  void *user_data);
158 };
159 
160 SPA_API_LOOP int spa_loop_add_source(struct spa_loop *object, struct spa_source *source)
161 {
162  return spa_api_method_r(int, -ENOTSUP,
163  spa_loop, &object->iface, add_source, 0, source);
164 }
165 SPA_API_LOOP int spa_loop_update_source(struct spa_loop *object, struct spa_source *source)
166 {
167  return spa_api_method_r(int, -ENOTSUP,
168  spa_loop, &object->iface, update_source, 0, source);
169 }
170 SPA_API_LOOP int spa_loop_remove_source(struct spa_loop *object, struct spa_source *source)
171 {
172  return spa_api_method_r(int, -ENOTSUP,
173  spa_loop, &object->iface, remove_source, 0, source);
174 }
175 SPA_API_LOOP int spa_loop_invoke(struct spa_loop *object,
176  spa_invoke_func_t func, uint32_t seq, const void *data,
177  size_t size, bool block, void *user_data)
178 {
179  return spa_api_method_r(int, -ENOTSUP,
180  spa_loop, &object->iface, invoke, 0, func, seq, data,
181  size, block, user_data);
182 }
183 SPA_API_LOOP int spa_loop_locked(struct spa_loop *object,
184  spa_invoke_func_t func, uint32_t seq, const void *data,
185  size_t size, void *user_data)
186 {
187  return spa_api_method_r(int, -ENOTSUP,
188  spa_loop, &object->iface, locked, 0, func, seq, data,
189  size, user_data);
190 }
191 
192 
196 struct spa_loop_control_hooks {
197 #define SPA_VERSION_LOOP_CONTROL_HOOKS 0
198  uint32_t version;
201  void (*before) (void *data);
204  void (*after) (void *data);
205 };
206 
208 {
209  struct spa_hook *h;
211  spa_callbacks_call_fast(&h->cb, struct spa_loop_control_hooks, before, 0);
212 }
213 
215 {
216  struct spa_hook *h;
217  spa_list_for_each(h, &l->list, link)
219 }
220 
245  /* the version of this structure. This can be used to expand this
246  * structure in the future */
247 #define SPA_VERSION_LOOP_CONTROL_METHODS 2
248  uint32_t version;
249 
259  int (*get_fd) (void *object);
260 
267  void (*add_hook) (void *object,
268  struct spa_hook *hook,
269  const struct spa_loop_control_hooks *hooks,
270  void *data);
271 
280  void (*enter) (void *object);
289  void (*leave) (void *object);
290 
302  int (*iterate) (void *object, int timeout);
303 
312  int (*check) (void *object);
313 
321  int (*lock) (void *object);
322 
330  int (*unlock) (void *object);
331 
338  int (*get_time) (void *object, struct timespec *abstime, int64_t timeout);
339 
350  int (*wait) (void *object, const struct timespec *abstime);
351 
365  int (*signal) (void *object, bool wait_for_accept);
366 
376  int (*accept) (void *object);
377 };
378 
380 {
381  return spa_api_method_r(int, -ENOTSUP,
382  spa_loop_control, &object->iface, get_fd, 0);
383 }
385  struct spa_hook *hook, const struct spa_loop_control_hooks *hooks,
386  void *data)
387 {
388  spa_api_method_v(spa_loop_control, &object->iface, add_hook, 0,
389  hook, hooks, data);
390 }
392 {
393  spa_api_method_v(spa_loop_control, &object->iface, enter, 0);
394 }
396 {
398 }
400  int timeout)
401 {
402  return spa_api_method_r(int, -ENOTSUP,
403  spa_loop_control, &object->iface, iterate, 0, timeout);
404 }
406  int timeout)
407 {
408  return spa_api_method_fast_r(int, -ENOTSUP,
409  spa_loop_control, &object->iface, iterate, 0, timeout);
410 }
412 {
413  return spa_api_method_r(int, -ENOTSUP,
414  spa_loop_control, &object->iface, check, 1);
415 }
417 {
418  return spa_api_method_r(int, -ENOTSUP,
419  spa_loop_control, &object->iface, lock, 2);
420 }
422 {
423  return spa_api_method_r(int, -ENOTSUP,
424  spa_loop_control, &object->iface, unlock, 2);
425 }
427  struct timespec *abstime, int64_t timeout)
428 {
429  return spa_api_method_r(int, -ENOTSUP,
430  spa_loop_control, &object->iface, get_time, 2, abstime, timeout);
431 }
433  const struct timespec *abstime)
434 {
435  return spa_api_method_r(int, -ENOTSUP,
436  spa_loop_control, &object->iface, wait, 2, abstime);
437 }
438 SPA_API_LOOP int spa_loop_control_signal(struct spa_loop_control *object, bool wait_for_accept)
439 {
440  return spa_api_method_r(int, -ENOTSUP,
441  spa_loop_control, &object->iface, signal, 2, wait_for_accept);
442 }
444 {
445  return spa_api_method_r(int, -ENOTSUP,
446  spa_loop_control, &object->iface, accept, 2);
447 }
448 
449 typedef void (*spa_source_io_func_t) (void *data, int fd, uint32_t mask);
450 typedef void (*spa_source_idle_func_t) (void *data);
451 typedef void (*spa_source_event_func_t) (void *data, uint64_t count);
452 typedef void (*spa_source_timer_func_t) (void *data, uint64_t expirations);
453 typedef void (*spa_source_signal_func_t) (void *data, int signal_number);
454 
458 struct spa_loop_utils_methods {
459  /* the version of this structure. This can be used to expand this
460  * structure in the future */
461 #define SPA_VERSION_LOOP_UTILS_METHODS 0
462  uint32_t version;
463 
464  struct spa_source *(*add_io) (void *object,
465  int fd,
466  uint32_t mask,
467  bool close,
469 
470  int (*update_io) (void *object, struct spa_source *source, uint32_t mask);
471 
472  struct spa_source *(*add_idle) (void *object,
473  bool enabled,
475  int (*enable_idle) (void *object, struct spa_source *source, bool enabled);
476 
477  struct spa_source *(*add_event) (void *object,
479  int (*signal_event) (void *object, struct spa_source *source);
480 
481  struct spa_source *(*add_timer) (void *object,
483  int (*update_timer) (void *object,
484  struct spa_source *source,
485  struct timespec *value,
486  struct timespec *interval,
487  bool absolute);
488  struct spa_source *(*add_signal) (void *object,
489  int signal_number,
491 
495  void (*destroy_source) (void *object, struct spa_source *source);
496 };
497 
499 spa_loop_utils_add_io(struct spa_loop_utils *object, int fd, uint32_t mask,
500  bool close, spa_source_io_func_t func, void *data)
501 {
502  return spa_api_method_r(struct spa_source *, NULL,
503  spa_loop_utils, &object->iface, add_io, 0, fd, mask, close, func, data);
504 }
506  struct spa_source *source, uint32_t mask)
507 {
508  return spa_api_method_r(int, -ENOTSUP,
509  spa_loop_utils, &object->iface, update_io, 0, source, mask);
510 }
511 SPA_API_LOOP struct spa_source *
512 spa_loop_utils_add_idle(struct spa_loop_utils *object, bool enabled,
514 {
515  return spa_api_method_r(struct spa_source *, NULL,
516  spa_loop_utils, &object->iface, add_idle, 0, enabled, func, data);
517 }
519  struct spa_source *source, bool enabled)
520 {
521  return spa_api_method_r(int, -ENOTSUP,
522  spa_loop_utils, &object->iface, enable_idle, 0, source, enabled);
523 }
526 {
527  return spa_api_method_r(struct spa_source *, NULL,
528  spa_loop_utils, &object->iface, add_event, 0, func, data);
529 }
531  struct spa_source *source)
532 {
533  return spa_api_method_r(int, -ENOTSUP,
534  spa_loop_utils, &object->iface, signal_event, 0, source);
535 }
536 SPA_API_LOOP struct spa_source *
538 {
539  return spa_api_method_r(struct spa_source *, NULL,
540  spa_loop_utils, &object->iface, add_timer, 0, func, data);
541 }
543  struct spa_source *source, struct timespec *value,
544  struct timespec *interval, bool absolute)
545 {
546  return spa_api_method_r(int, -ENOTSUP,
547  spa_loop_utils, &object->iface, update_timer, 0, source,
548  value, interval, absolute);
549 }
550 SPA_API_LOOP struct spa_source *
551 spa_loop_utils_add_signal(struct spa_loop_utils *object, int signal_number,
553 {
554  return spa_api_method_r(struct spa_source *, NULL,
555  spa_loop_utils, &object->iface, add_signal, 0,
556  signal_number, func, data);
557 }
559  struct spa_source *source)
560 {
561  spa_api_method_v(spa_loop_utils, &object->iface, destroy_source, 0, source);
562 }
563 
568 #ifdef __cplusplus
569 } /* extern "C" */
570 #endif
571 
572 #endif /* SPA_LOOP_H */
spa/utils/defs.h
uint32_t int seq
Definition: core.h:432
#define spa_api_method_r(rtype, def, type, o, method, version,...)
Definition: hook.h:291
#define spa_api_method_fast_r(rtype, def, type, o, method, version,...)
Definition: hook.h:325
#define spa_callbacks_call_fast(callbacks, type, method, vers,...)
Definition: hook.h:184
#define spa_api_method_v(type, o, method, version,...)
Definition: hook.h:285
#define spa_list_for_each_reverse(pos, head, member)
Definition: list.h:122
#define spa_list_for_each(pos, head, member)
Definition: list.h:119
SPA_API_LOOP int spa_loop_invoke(struct spa_loop *object, spa_invoke_func_t func, uint32_t seq, const void *data, size_t size, bool block, void *user_data)
Definition: loop.h:191
SPA_API_LOOP void spa_loop_control_hook_before(struct spa_hook_list *l)
Definition: loop.h:224
SPA_API_LOOP int spa_loop_control_accept(struct spa_loop_control *object)
Definition: loop.h:461
SPA_API_LOOP int spa_loop_add_source(struct spa_loop *object, struct spa_source *source)
Definition: loop.h:176
void(* spa_source_timer_func_t)(void *data, uint64_t expirations)
Definition: loop.h:470
SPA_API_LOOP int spa_loop_control_get_fd(struct spa_loop_control *object)
Definition: loop.h:397
SPA_API_LOOP void spa_loop_control_enter(struct spa_loop_control *object)
Definition: loop.h:409
SPA_API_LOOP struct spa_source * spa_loop_utils_add_idle(struct spa_loop_utils *object, bool enabled, spa_source_idle_func_t func, void *data)
Definition: loop.h:531
SPA_API_LOOP int spa_loop_control_signal(struct spa_loop_control *object, bool wait_for_accept)
Definition: loop.h:456
SPA_API_LOOP int spa_loop_remove_source(struct spa_loop *object, struct spa_source *source)
Definition: loop.h:186
SPA_API_LOOP int spa_loop_utils_update_timer(struct spa_loop_utils *object, struct spa_source *source, struct timespec *value, struct timespec *interval, bool absolute)
Definition: loop.h:561
SPA_API_LOOP int spa_loop_utils_enable_idle(struct spa_loop_utils *object, struct spa_source *source, bool enabled)
Definition: loop.h:537
void(* spa_source_event_func_t)(void *data, uint64_t count)
Definition: loop.h:469
void(* spa_source_signal_func_t)(void *data, int signal_number)
Definition: loop.h:471
SPA_API_LOOP int spa_loop_control_iterate_fast(struct spa_loop_control *object, int timeout)
Definition: loop.h:423
SPA_API_LOOP struct spa_source * spa_loop_utils_add_signal(struct spa_loop_utils *object, int signal_number, spa_source_signal_func_t func, void *data)
Definition: loop.h:570
SPA_API_LOOP void spa_loop_control_add_hook(struct spa_loop_control *object, struct spa_hook *hook, const struct spa_loop_control_hooks *hooks, void *data)
Definition: loop.h:402
SPA_API_LOOP int spa_loop_control_wait(struct spa_loop_control *object, const struct timespec *abstime)
Definition: loop.h:450
void(* spa_source_idle_func_t)(void *data)
Definition: loop.h:468
SPA_API_LOOP int spa_loop_control_iterate(struct spa_loop_control *object, int timeout)
Definition: loop.h:417
SPA_API_LOOP int spa_loop_control_unlock(struct spa_loop_control *object)
Definition: loop.h:439
SPA_API_LOOP void spa_loop_utils_destroy_source(struct spa_loop_utils *object, struct spa_source *source)
Definition: loop.h:577
void(* spa_source_func_t)(struct spa_source *source)
Definition: loop.h:65
SPA_API_LOOP int spa_loop_control_check(struct spa_loop_control *object)
Definition: loop.h:429
SPA_API_LOOP struct spa_source * spa_loop_utils_add_event(struct spa_loop_utils *object, spa_source_event_func_t func, void *data)
Definition: loop.h:544
SPA_API_LOOP struct spa_source * spa_loop_utils_add_io(struct spa_loop_utils *object, int fd, uint32_t mask, bool close, spa_source_io_func_t func, void *data)
Definition: loop.h:518
SPA_API_LOOP void spa_loop_control_hook_after(struct spa_hook_list *l)
Definition: loop.h:231
SPA_API_LOOP int spa_loop_control_get_time(struct spa_loop_control *object, struct timespec *abstime, int64_t timeout)
Definition: loop.h:444
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:78
SPA_API_LOOP struct spa_source * spa_loop_utils_add_timer(struct spa_loop_utils *object, spa_source_timer_func_t func, void *data)
Definition: loop.h:556
void(* spa_source_io_func_t)(void *data, int fd, uint32_t mask)
Definition: loop.h:467
SPA_API_LOOP int spa_loop_control_lock(struct spa_loop_control *object)
Definition: loop.h:434
SPA_API_LOOP int spa_loop_utils_signal_event(struct spa_loop_utils *object, struct spa_source *source)
Definition: loop.h:549
SPA_API_LOOP int spa_loop_utils_update_io(struct spa_loop_utils *object, struct spa_source *source, uint32_t mask)
Definition: loop.h:524
SPA_API_LOOP void spa_loop_control_leave(struct spa_loop_control *object)
Definition: loop.h:413
SPA_API_LOOP int spa_loop_locked(struct spa_loop *object, spa_invoke_func_t func, uint32_t seq, const void *data, size_t size, void *user_data)
Definition: loop.h:199
SPA_API_LOOP int spa_loop_update_source(struct spa_loop *object, struct spa_source *source)
Definition: loop.h:181
spa/utils/hook.h
#define SPA_API_LOOP
Definition: loop.h:29
A list of hooks.
Definition: hook.h:416
struct spa_list list
Definition: hook.h:417
A hook, contains the structure with functions and the data passed to the functions.
Definition: hook.h:427
struct spa_callbacks cb
Definition: hook.h:429
struct spa_list link
Definition: hook.h:428
Definition: hook.h:148
Control hooks.
Definition: loop.h:212
void(* before)(void *data)
Executed right before waiting for events.
Definition: loop.h:218
uint32_t version
Definition: loop.h:215
void(* after)(void *data)
Executed right after waiting for events.
Definition: loop.h:221
Control an event loop.
Definition: loop.h:261
Definition: loop.h:54
struct spa_interface iface
Definition: loop.h:54
Register sources and work items to an event loop.
Definition: loop.h:88
int(* add_source)(void *object, struct spa_source *source)
Add a source to the loop.
Definition: loop.h:101
int(* locked)(void *object, spa_invoke_func_t func, uint32_t seq, const void *data, size_t size, void *user_data)
Call a function with the loop lock acquired May be called from any thread and multiple threads at the...
Definition: loop.h:168
int(* remove_source)(void *object, struct spa_source *source)
Remove a source from the loop.
Definition: loop.h:119
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:149
int(* update_source)(void *object, struct spa_source *source)
Update the source io mask.
Definition: loop.h:110
uint32_t version
Definition: loop.h:93
Create sources for an event loop.
Definition: loop.h:476
int(* update_io)(void *object, struct spa_source *source, uint32_t mask)
Definition: loop.h:489
int(* enable_idle)(void *object, struct spa_source *source, bool enabled)
Definition: loop.h:494
int(* signal_event)(void *object, struct spa_source *source)
Definition: loop.h:498
int(* update_timer)(void *object, struct spa_source *source, struct timespec *value, struct timespec *interval, bool absolute)
Definition: loop.h:502
void(* destroy_source)(void *object, struct spa_source *source)
destroy a source allocated with this interface.
Definition: loop.h:514
uint32_t version
Definition: loop.h:481
Definition: loop.h:60
struct spa_interface iface
Definition: loop.h:60
Definition: loop.h:48
struct spa_interface iface
Definition: loop.h:48
Definition: loop.h:67
uint32_t rmask
Definition: loop.h:73
void * data
Definition: loop.h:70
void * priv
Definition: loop.h:75
uint32_t mask
Definition: loop.h:72
spa_source_func_t func
Definition: loop.h:69
int fd
Definition: loop.h:71
struct spa_loop * loop
Definition: loop.h:68
spa/support/system.h