1 | #ifndef foomainloophfoo |
2 | #define foomainloophfoo |
3 | |
4 | /*** |
5 | This file is part of PulseAudio. |
6 | |
7 | Copyright 2004-2006 Lennart Poettering |
8 | Copyright 2006 Pierre Ossman <ossman@cendio.se> for Cendio AB |
9 | |
10 | PulseAudio is free software; you can redistribute it and/or modify |
11 | it under the terms of the GNU Lesser General Public License as published |
12 | by the Free Software Foundation; either version 2.1 of the License, |
13 | or (at your option) any later version. |
14 | |
15 | PulseAudio is distributed in the hope that it will be useful, but |
16 | WITHOUT ANY WARRANTY; without even the implied warranty of |
17 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
18 | General Public License for more details. |
19 | |
20 | You should have received a copy of the GNU Lesser General Public License |
21 | along with PulseAudio; if not, see <http://www.gnu.org/licenses/>. |
22 | ***/ |
23 | |
24 | #include <pulse/mainloop-api.h> |
25 | #include <pulse/cdecl.h> |
26 | |
27 | PA_C_DECL_BEGIN |
28 | |
29 | struct pollfd; |
30 | |
31 | /** \page mainloop Main Loop |
32 | * |
33 | * \section overv_sec Overview |
34 | * |
35 | * The built-in main loop implementation is based on the poll() system call. |
36 | * It supports the functions defined in the main loop abstraction and very |
37 | * little else. |
38 | * |
39 | * The main loop is created using pa_mainloop_new() and destroyed using |
40 | * pa_mainloop_free(). To get access to the main loop abstraction, |
41 | * pa_mainloop_get_api() is used. |
42 | * |
43 | * \section iter_sec Iteration |
44 | * |
45 | * The main loop is designed around the concept of iterations. Each iteration |
46 | * consists of three steps that repeat during the application's entire |
47 | * lifetime: |
48 | * |
49 | * -# Prepare - Build a list of file descriptors |
50 | * that need to be monitored and calculate the next timeout. |
51 | * -# Poll - Execute the actual poll() system call. |
52 | * -# Dispatch - Dispatch any events that have fired. |
53 | * |
54 | * When using the main loop, the application can either execute each |
55 | * iteration, one at a time, using pa_mainloop_iterate(), or let the library |
56 | * iterate automatically using pa_mainloop_run(). |
57 | * |
58 | * \section thread_sec Threads |
59 | * |
60 | * The main loop functions are designed to be thread safe, but the objects |
61 | * are not. What this means is that multiple main loops can be used, but only |
62 | * one object per thread. |
63 | * |
64 | */ |
65 | |
66 | /** \file |
67 | * |
68 | * A minimal main loop implementation based on the C library's poll() |
69 | * function. Using the routines defined herein you may create a simple |
70 | * main loop supporting the generic main loop abstraction layer as |
71 | * defined in \ref mainloop-api.h. This implementation is thread safe |
72 | * as long as you access the main loop object from a single thread only. |
73 | * |
74 | * See also \subpage mainloop |
75 | */ |
76 | |
77 | /** An opaque main loop object */ |
78 | typedef struct pa_mainloop pa_mainloop; |
79 | |
80 | /** Allocate a new main loop object */ |
81 | pa_mainloop *pa_mainloop_new(void); |
82 | |
83 | /** Free a main loop object */ |
84 | void pa_mainloop_free(pa_mainloop* m); |
85 | |
86 | /** Prepare for a single iteration of the main loop. Returns a negative value |
87 | on error or exit request. timeout specifies a maximum timeout for the subsequent |
88 | poll, or -1 for blocking behaviour. .*/ |
89 | int pa_mainloop_prepare(pa_mainloop *m, int timeout); |
90 | |
91 | /** Execute the previously prepared poll. Returns a negative value on error.*/ |
92 | int pa_mainloop_poll(pa_mainloop *m); |
93 | |
94 | /** Dispatch timeout, io and deferred events from the previously executed poll. Returns |
95 | a negative value on error. On success returns the number of source dispatched. */ |
96 | int pa_mainloop_dispatch(pa_mainloop *m); |
97 | |
98 | /** Return the return value as specified with the main loop's quit() routine. */ |
99 | int pa_mainloop_get_retval(pa_mainloop *m); |
100 | |
101 | /** Run a single iteration of the main loop. This is a convenience function |
102 | for pa_mainloop_prepare(), pa_mainloop_poll() and pa_mainloop_dispatch(). |
103 | Returns a negative value on error or exit request. If block is nonzero, |
104 | block for events if none are queued. Optionally return the return value as |
105 | specified with the main loop's quit() routine in the integer variable retval points |
106 | to. On success returns the number of sources dispatched in this iteration. */ |
107 | int pa_mainloop_iterate(pa_mainloop *m, int block, int *retval); |
108 | |
109 | /** Run unlimited iterations of the main loop object until the main loop's quit() routine is called. */ |
110 | int pa_mainloop_run(pa_mainloop *m, int *retval); |
111 | |
112 | /** Return the abstract main loop abstraction layer vtable for this |
113 | main loop. No need to free the API as it is owned by the loop |
114 | and is destroyed when the loop is freed. */ |
115 | pa_mainloop_api* pa_mainloop_get_api(pa_mainloop*m); |
116 | |
117 | /** Shutdown the main loop with the specified return value */ |
118 | void pa_mainloop_quit(pa_mainloop *m, int retval); |
119 | |
120 | /** Interrupt a running poll (for threaded systems) */ |
121 | void pa_mainloop_wakeup(pa_mainloop *m); |
122 | |
123 | /** Generic prototype of a poll() like function */ |
124 | typedef int (*pa_poll_func)(struct pollfd *ufds, unsigned long nfds, int timeout, void*userdata); |
125 | |
126 | /** Change the poll() implementation */ |
127 | void pa_mainloop_set_poll_func(pa_mainloop *m, pa_poll_func poll_func, void *userdata); |
128 | |
129 | PA_C_DECL_END |
130 | |
131 | #endif |
132 | |