]> code.delx.au - pulseaudio/blob - src/pulsecore/rtpoll.h
Merge dead branch 'lennart'
[pulseaudio] / src / pulsecore / rtpoll.h
1 #ifndef foopulsertpollhfoo
2 #define foopulsertpollhfoo
3
4 /***
5 This file is part of PulseAudio.
6
7 Copyright 2004-2006 Lennart Poettering
8
9 PulseAudio is free software; you can redistribute it and/or modify
10 it under the terms of the GNU Lesser General Public License as
11 published by the Free Software Foundation; either version 2.1 of the
12 License, or (at your option) any later version.
13
14 PulseAudio is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 Lesser General Public License for more details.
18
19 You should have received a copy of the GNU Lesser General Public
20 License along with PulseAudio; if not, write to the Free Software
21 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
22 USA.
23 ***/
24
25 #include <sys/types.h>
26 #include <limits.h>
27
28 #include <pulse/sample.h>
29 #include <pulsecore/asyncmsgq.h>
30 #include <pulsecore/fdsem.h>
31 #include <pulsecore/macro.h>
32
33 /* An implementation of a "real-time" poll loop. Basically, this is
34 * yet another wrapper around poll(). However it has certain
35 * advantages over pa_mainloop and suchlike:
36 *
37 * 1) It uses timer_create() and POSIX real time signals to guarantee
38 * optimal high-resolution timing. Starting with Linux 2.6.21 hrtimers
39 * are available, and since right now only nanosleep() and the POSIX
40 * clock and timer interfaces have been ported to hrtimers (and not
41 * ppoll/pselect!) we have to combine ppoll() with timer_create(). The
42 * fact that POSIX timers and POSIX rt signals are used internally is
43 * completely hidden.
44 *
45 * 2) It allows raw access to the pollfd data to users
46 *
47 * 3) It allows arbitrary functions to be run before entering the
48 * actual poll() and after it.
49 *
50 * Only a single interval timer is supported..*/
51
52 typedef struct pa_rtpoll pa_rtpoll;
53 typedef struct pa_rtpoll_item pa_rtpoll_item;
54
55 typedef enum pa_rtpoll_priority {
56 PA_RTPOLL_EARLY = -100, /* For veeery important stuff, like handling control messages */
57 PA_RTPOLL_NORMAL = 0, /* For normal stuff */
58 PA_RTPOLL_LATE = +100, /* For housekeeping */
59 PA_RTPOLL_NEVER = INT_MAX, /* For stuff that doesn't register any callbacks, but only fds to listen on */
60 } pa_rtpoll_priority_t;
61
62 pa_rtpoll *pa_rtpoll_new(void);
63 void pa_rtpoll_free(pa_rtpoll *p);
64
65 /* Install the rtpoll in the current thread */
66 void pa_rtpoll_install(pa_rtpoll *p);
67
68 /* Sleep on the rtpoll until the time event, or any of the fd events
69 * is triggered. If "wait" is 0 we don't sleep but only update the
70 * struct pollfd. Returns negative on error, positive if the loop
71 * should continue to run, 0 when the loop should be terminated
72 * cleanly. */
73 int pa_rtpoll_run(pa_rtpoll *f, pa_bool_t wait);
74
75 void pa_rtpoll_set_timer_absolute(pa_rtpoll *p, pa_usec_t usec);
76 void pa_rtpoll_set_timer_relative(pa_rtpoll *p, pa_usec_t usec);
77 void pa_rtpoll_set_timer_disabled(pa_rtpoll *p);
78
79 /* A new fd wakeup item for pa_rtpoll */
80 pa_rtpoll_item *pa_rtpoll_item_new(pa_rtpoll *p, pa_rtpoll_priority_t prio, unsigned n_fds);
81 void pa_rtpoll_item_free(pa_rtpoll_item *i);
82
83 /* Please note that this pointer might change on every call and when
84 * pa_rtpoll_run() is called. Hence: call this immediately before
85 * using the pointer and don't save the result anywhere */
86 struct pollfd *pa_rtpoll_item_get_pollfd(pa_rtpoll_item *i, unsigned *n_fds);
87
88 /* Set the callback that shall be called when there's time to do some work: If the
89 * callback returns a value > 0, the poll is skipped and the next
90 * iteraton of the loop will start immediately. */
91 void pa_rtpoll_item_set_work_callback(pa_rtpoll_item *i, int (*work_cb)(pa_rtpoll_item *i));
92
93 /* Set the callback that shall be called immediately before entering
94 * the sleeping poll: If the callback returns a value > 0, the poll is
95 * skipped and the next iteraton of the loop will start
96 * immediately.. */
97 void pa_rtpoll_item_set_before_callback(pa_rtpoll_item *i, int (*before_cb)(pa_rtpoll_item *i));
98
99 /* Set the callback that shall be called immediately after having
100 * entered the sleeping poll */
101 void pa_rtpoll_item_set_after_callback(pa_rtpoll_item *i, void (*after_cb)(pa_rtpoll_item *i));
102
103 void pa_rtpoll_item_set_userdata(pa_rtpoll_item *i, void *userdata);
104 void* pa_rtpoll_item_get_userdata(pa_rtpoll_item *i);
105
106 pa_rtpoll_item *pa_rtpoll_item_new_fdsem(pa_rtpoll *p, pa_rtpoll_priority_t prio, pa_fdsem *s);
107 pa_rtpoll_item *pa_rtpoll_item_new_asyncmsgq_read(pa_rtpoll *p, pa_rtpoll_priority_t prio, pa_asyncmsgq *q);
108 pa_rtpoll_item *pa_rtpoll_item_new_asyncmsgq_write(pa_rtpoll *p, pa_rtpoll_priority_t prio, pa_asyncmsgq *q);
109
110 /* Requests the loop to exit. Will cause the next iteration of
111 * pa_rtpoll_run() to return 0 */
112 void pa_rtpoll_quit(pa_rtpoll *p);
113
114 #endif