4 This file is part of PulseAudio.
6 Copyright 2006 Lennart Poettering
8 PulseAudio is free software; you can redistribute it and/or modify
9 it under the terms of the GNU Lesser General Public License as
10 published by the Free Software Foundation; either version 2 of the
11 License, or (at your option) any later version.
13 PulseAudio is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 General Public License for more details.
18 You should have received a copy of the GNU Lesser General Public
19 License along with PulseAudio; if not, write to the Free Software
20 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
28 #include <pulse/xmalloc.h>
30 #include <pulsecore/log.h>
31 #include <pulsecore/macro.h>
33 #include "avahi-wrap.h"
37 pa_mainloop_api
*mainloop
;
41 pa_io_event
*io_event
;
42 pa_avahi_poll
*avahi_poll
;
43 AvahiWatchEvent current_event
;
44 AvahiWatchCallback callback
;
48 static AvahiWatchEvent
translate_io_flags_back(pa_io_event_flags_t e
) {
50 (e
& PA_IO_EVENT_INPUT
? AVAHI_WATCH_IN
: 0) |
51 (e
& PA_IO_EVENT_OUTPUT
? AVAHI_WATCH_OUT
: 0) |
52 (e
& PA_IO_EVENT_ERROR
? AVAHI_WATCH_ERR
: 0) |
53 (e
& PA_IO_EVENT_HANGUP
? AVAHI_WATCH_HUP
: 0);
56 static pa_io_event_flags_t
translate_io_flags(AvahiWatchEvent e
) {
58 (e
& AVAHI_WATCH_IN
? PA_IO_EVENT_INPUT
: 0) |
59 (e
& AVAHI_WATCH_OUT
? PA_IO_EVENT_OUTPUT
: 0) |
60 (e
& AVAHI_WATCH_ERR
? PA_IO_EVENT_ERROR
: 0) |
61 (e
& AVAHI_WATCH_HUP
? PA_IO_EVENT_HANGUP
: 0);
64 static void watch_callback(pa_mainloop_api
*a
, pa_io_event
* e
, int fd
, pa_io_event_flags_t events
, void *userdata
) {
65 AvahiWatch
*w
= userdata
;
71 w
->current_event
= translate_io_flags_back(events
);
72 w
->callback(w
, fd
, w
->current_event
, w
->userdata
);
76 static AvahiWatch
* watch_new(const AvahiPoll
*api
, int fd
, AvahiWatchEvent event
, AvahiWatchCallback callback
, void *userdata
) {
83 pa_assert_se(p
= api
->userdata
);
85 w
= pa_xnew(AvahiWatch
, 1);
88 w
->callback
= callback
;
89 w
->userdata
= userdata
;
90 w
->io_event
= p
->mainloop
->io_new(p
->mainloop
, fd
, translate_io_flags(event
), watch_callback
, w
);
95 static void watch_update(AvahiWatch
*w
, AvahiWatchEvent event
) {
98 w
->avahi_poll
->mainloop
->io_enable(w
->io_event
, translate_io_flags(event
));
101 static AvahiWatchEvent
watch_get_events(AvahiWatch
*w
) {
104 return w
->current_event
;
107 static void watch_free(AvahiWatch
*w
) {
110 w
->avahi_poll
->mainloop
->io_free(w
->io_event
);
114 struct AvahiTimeout
{
115 pa_time_event
*time_event
;
116 pa_avahi_poll
*avahi_poll
;
117 AvahiTimeoutCallback callback
;
121 static void timeout_callback(pa_mainloop_api
*a
, pa_time_event
* e
, const struct timeval
*tv
, void *userdata
) {
122 AvahiTimeout
*t
= userdata
;
128 t
->callback(t
, t
->userdata
);
131 static AvahiTimeout
* timeout_new(const AvahiPoll
*api
, const struct timeval
*tv
, AvahiTimeoutCallback callback
, void *userdata
) {
137 pa_assert_se(p
= api
->userdata
);
139 t
= pa_xnew(AvahiTimeout
, 1);
141 t
->callback
= callback
;
142 t
->userdata
= userdata
;
144 t
->time_event
= tv
? p
->mainloop
->time_new(p
->mainloop
, tv
, timeout_callback
, t
) : NULL
;
149 static void timeout_update(AvahiTimeout
*t
, const struct timeval
*tv
) {
152 if (t
->time_event
&& tv
)
153 t
->avahi_poll
->mainloop
->time_restart(t
->time_event
, tv
);
154 else if (!t
->time_event
&& tv
)
155 t
->time_event
= t
->avahi_poll
->mainloop
->time_new(t
->avahi_poll
->mainloop
, tv
, timeout_callback
, t
);
156 else if (t
->time_event
&& !tv
) {
157 t
->avahi_poll
->mainloop
->time_free(t
->time_event
);
158 t
->time_event
= NULL
;
162 static void timeout_free(AvahiTimeout
*t
) {
166 t
->avahi_poll
->mainloop
->time_free(t
->time_event
);
170 AvahiPoll
* pa_avahi_poll_new(pa_mainloop_api
*m
) {
175 p
= pa_xnew(pa_avahi_poll
, 1);
178 p
->api
.watch_new
= watch_new
;
179 p
->api
.watch_update
= watch_update
;
180 p
->api
.watch_get_events
= watch_get_events
;
181 p
->api
.watch_free
= watch_free
;
182 p
->api
.timeout_new
= timeout_new
;
183 p
->api
.timeout_update
= timeout_update
;
184 p
->api
.timeout_free
= timeout_free
;
190 void pa_avahi_poll_free(AvahiPoll
*api
) {
193 pa_assert_se(p
= api
->userdata
);