]> code.delx.au - pulseaudio/blob - src/pulsecore/rtpoll.h
remap: Change remapping function argument type from void to int16_t / float as approp...
[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) High resolution timers are used
38 *
39 * 2) It allows raw access to the pollfd data to users
40 *
41 * 3) It allows arbitrary functions to be run before entering the
42 * actual poll() and after it.
43 *
44 * Only a single interval timer is supported..*/
45
46 typedef struct pa_rtpoll pa_rtpoll;
47 typedef struct pa_rtpoll_item pa_rtpoll_item;
48
49 typedef enum pa_rtpoll_priority {
50 PA_RTPOLL_EARLY = -100, /* For very important stuff, like handling control messages */
51 PA_RTPOLL_NORMAL = 0, /* For normal stuff */
52 PA_RTPOLL_LATE = +100, /* For housekeeping */
53 PA_RTPOLL_NEVER = INT_MAX, /* For stuff that doesn't register any callbacks, but only fds to listen on */
54 } pa_rtpoll_priority_t;
55
56 pa_rtpoll *pa_rtpoll_new(void);
57 void pa_rtpoll_free(pa_rtpoll *p);
58
59 /* Sleep on the rtpoll until the time event, or any of the fd events
60 * is triggered. If "wait" is 0 we don't sleep but only update the
61 * struct pollfd. Returns negative on error, positive if the loop
62 * should continue to run, 0 when the loop should be terminated
63 * cleanly. */
64 int pa_rtpoll_run(pa_rtpoll *f, bool wait);
65
66 void pa_rtpoll_set_timer_absolute(pa_rtpoll *p, pa_usec_t usec);
67 void pa_rtpoll_set_timer_relative(pa_rtpoll *p, pa_usec_t usec);
68 void pa_rtpoll_set_timer_disabled(pa_rtpoll *p);
69
70 /* Return true when the elapsed timer was the reason for
71 * the last pa_rtpoll_run() invocation to finish */
72 bool pa_rtpoll_timer_elapsed(pa_rtpoll *p);
73
74 /* A new fd wakeup item for pa_rtpoll */
75 pa_rtpoll_item *pa_rtpoll_item_new(pa_rtpoll *p, pa_rtpoll_priority_t prio, unsigned n_fds);
76 void pa_rtpoll_item_free(pa_rtpoll_item *i);
77
78 /* Please note that this pointer might change on every call and when
79 * pa_rtpoll_run() is called. Hence: call this immediately before
80 * using the pointer and don't save the result anywhere */
81 struct pollfd *pa_rtpoll_item_get_pollfd(pa_rtpoll_item *i, unsigned *n_fds);
82
83 /* Set the callback that shall be called when there's time to do some work: If the
84 * callback returns a value > 0, the poll is skipped and the next
85 * iteration of the loop will start immediately. */
86 void pa_rtpoll_item_set_work_callback(pa_rtpoll_item *i, int (*work_cb)(pa_rtpoll_item *i));
87
88 /* Set the callback that shall be called immediately before entering
89 * the sleeping poll: If the callback returns a value > 0, the poll is
90 * skipped and the next iteration of the loop will start immediately. */
91 void pa_rtpoll_item_set_before_callback(pa_rtpoll_item *i, int (*before_cb)(pa_rtpoll_item *i));
92
93 /* Set the callback that shall be called immediately after having
94 * entered the sleeping poll */
95 void pa_rtpoll_item_set_after_callback(pa_rtpoll_item *i, void (*after_cb)(pa_rtpoll_item *i));
96
97 void pa_rtpoll_item_set_userdata(pa_rtpoll_item *i, void *userdata);
98 void* pa_rtpoll_item_get_userdata(pa_rtpoll_item *i);
99
100 pa_rtpoll_item *pa_rtpoll_item_new_fdsem(pa_rtpoll *p, pa_rtpoll_priority_t prio, pa_fdsem *s);
101 pa_rtpoll_item *pa_rtpoll_item_new_asyncmsgq_read(pa_rtpoll *p, pa_rtpoll_priority_t prio, pa_asyncmsgq *q);
102 pa_rtpoll_item *pa_rtpoll_item_new_asyncmsgq_write(pa_rtpoll *p, pa_rtpoll_priority_t prio, pa_asyncmsgq *q);
103
104 /* Requests the loop to exit. Will cause the next iteration of
105 * pa_rtpoll_run() to return 0 */
106 void pa_rtpoll_quit(pa_rtpoll *p);
107
108 #endif