]> code.delx.au - pulseaudio/blob - src/pulsecore/rtpoll.h
remap: make the MMX code pretier
[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 /* Sleep on the rtpoll until the time event, or any of the fd events
66 * is triggered. If "wait" is 0 we don't sleep but only update the
67 * struct pollfd. Returns negative on error, positive if the loop
68 * should continue to run, 0 when the loop should be terminated
69 * cleanly. */
70 int pa_rtpoll_run(pa_rtpoll *f, pa_bool_t wait);
71
72 void pa_rtpoll_set_timer_absolute(pa_rtpoll *p, pa_usec_t usec);
73 void pa_rtpoll_set_timer_relative(pa_rtpoll *p, pa_usec_t usec);
74 void pa_rtpoll_set_timer_disabled(pa_rtpoll *p);
75
76 /* A new fd wakeup item for pa_rtpoll */
77 pa_rtpoll_item *pa_rtpoll_item_new(pa_rtpoll *p, pa_rtpoll_priority_t prio, unsigned n_fds);
78 void pa_rtpoll_item_free(pa_rtpoll_item *i);
79
80 /* Please note that this pointer might change on every call and when
81 * pa_rtpoll_run() is called. Hence: call this immediately before
82 * using the pointer and don't save the result anywhere */
83 struct pollfd *pa_rtpoll_item_get_pollfd(pa_rtpoll_item *i, unsigned *n_fds);
84
85 /* Set the callback that shall be called when there's time to do some work: If the
86 * callback returns a value > 0, the poll is skipped and the next
87 * iteraton of the loop will start immediately. */
88 void pa_rtpoll_item_set_work_callback(pa_rtpoll_item *i, int (*work_cb)(pa_rtpoll_item *i));
89
90 /* Set the callback that shall be called immediately before entering
91 * the sleeping poll: If the callback returns a value > 0, the poll is
92 * skipped and the next iteraton of the loop will start
93 * immediately.. */
94 void pa_rtpoll_item_set_before_callback(pa_rtpoll_item *i, int (*before_cb)(pa_rtpoll_item *i));
95
96 /* Set the callback that shall be called immediately after having
97 * entered the sleeping poll */
98 void pa_rtpoll_item_set_after_callback(pa_rtpoll_item *i, void (*after_cb)(pa_rtpoll_item *i));
99
100 void pa_rtpoll_item_set_userdata(pa_rtpoll_item *i, void *userdata);
101 void* pa_rtpoll_item_get_userdata(pa_rtpoll_item *i);
102
103 pa_rtpoll_item *pa_rtpoll_item_new_fdsem(pa_rtpoll *p, pa_rtpoll_priority_t prio, pa_fdsem *s);
104 pa_rtpoll_item *pa_rtpoll_item_new_asyncmsgq_read(pa_rtpoll *p, pa_rtpoll_priority_t prio, pa_asyncmsgq *q);
105 pa_rtpoll_item *pa_rtpoll_item_new_asyncmsgq_write(pa_rtpoll *p, pa_rtpoll_priority_t prio, pa_asyncmsgq *q);
106
107 /* Requests the loop to exit. Will cause the next iteration of
108 * pa_rtpoll_run() to return 0 */
109 void pa_rtpoll_quit(pa_rtpoll *p);
110
111 #endif