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
26 #include <pulse/xmalloc.h>
28 #include <pulsecore/log.h>
30 #include "avahi-wrap.h"
34 pa_mainloop_api
*mainloop
;
38 pa_io_event
*io_event
;
39 pa_avahi_poll
*avahi_poll
;
40 AvahiWatchEvent current_event
;
41 AvahiWatchCallback callback
;
45 static AvahiWatchEvent
translate_io_flags_back(pa_io_event_flags_t e
) {
47 (e
& PA_IO_EVENT_INPUT
? AVAHI_WATCH_IN
: 0) |
48 (e
& PA_IO_EVENT_OUTPUT
? AVAHI_WATCH_OUT
: 0) |
49 (e
& PA_IO_EVENT_ERROR
? AVAHI_WATCH_ERR
: 0) |
50 (e
& PA_IO_EVENT_HANGUP
? AVAHI_WATCH_HUP
: 0);
53 static pa_io_event_flags_t
translate_io_flags(AvahiWatchEvent e
) {
55 (e
& AVAHI_WATCH_IN
? PA_IO_EVENT_INPUT
: 0) |
56 (e
& AVAHI_WATCH_OUT
? PA_IO_EVENT_OUTPUT
: 0) |
57 (e
& AVAHI_WATCH_ERR
? PA_IO_EVENT_ERROR
: 0) |
58 (e
& AVAHI_WATCH_HUP
? PA_IO_EVENT_HANGUP
: 0);
61 static void watch_callback(pa_mainloop_api
*a
, pa_io_event
* e
, int fd
, pa_io_event_flags_t events
, void *userdata
) {
62 AvahiWatch
*w
= userdata
;
68 w
->current_event
= translate_io_flags_back(events
);
69 w
->callback(w
, fd
, w
->current_event
, w
->userdata
);
73 static AvahiWatch
* watch_new(const AvahiPoll
*api
, int fd
, AvahiWatchEvent event
, AvahiWatchCallback callback
, void *userdata
) {
84 w
= pa_xnew(AvahiWatch
, 1);
87 w
->callback
= callback
;
88 w
->userdata
= userdata
;
89 w
->io_event
= p
->mainloop
->io_new(p
->mainloop
, fd
, translate_io_flags(event
), watch_callback
, w
);
94 static void watch_update(AvahiWatch
*w
, AvahiWatchEvent event
) {
97 w
->avahi_poll
->mainloop
->io_enable(w
->io_event
, translate_io_flags(event
));
100 static AvahiWatchEvent
watch_get_events(AvahiWatch
*w
) {
103 return w
->current_event
;
106 static void watch_free(AvahiWatch
*w
) {
109 w
->avahi_poll
->mainloop
->io_free(w
->io_event
);
113 struct AvahiTimeout
{
114 pa_time_event
*time_event
;
115 pa_avahi_poll
*avahi_poll
;
116 AvahiTimeoutCallback callback
;
120 static void timeout_callback(pa_mainloop_api
*a
, pa_time_event
* e
, const struct timeval
*tv
, void *userdata
) {
121 AvahiTimeout
*t
= userdata
;
127 t
->callback(t
, t
->userdata
);
130 static AvahiTimeout
* timeout_new(const AvahiPoll
*api
, const struct timeval
*tv
, AvahiTimeoutCallback callback
, void *userdata
) {
140 t
= pa_xnew(AvahiTimeout
, 1);
142 t
->callback
= callback
;
143 t
->userdata
= userdata
;
145 t
->time_event
= tv
? p
->mainloop
->time_new(p
->mainloop
, tv
, timeout_callback
, t
) : NULL
;
150 static void timeout_update(AvahiTimeout
*t
, const struct timeval
*tv
) {
153 if (t
->time_event
&& tv
)
154 t
->avahi_poll
->mainloop
->time_restart(t
->time_event
, tv
);
155 else if (!t
->time_event
&& tv
)
156 t
->time_event
= t
->avahi_poll
->mainloop
->time_new(t
->avahi_poll
->mainloop
, tv
, timeout_callback
, t
);
157 else if (t
->time_event
&& !tv
) {
158 t
->avahi_poll
->mainloop
->time_free(t
->time_event
);
159 t
->time_event
= NULL
;
163 static void timeout_free(AvahiTimeout
*t
) {
167 t
->avahi_poll
->mainloop
->time_free(t
->time_event
);
171 AvahiPoll
* pa_avahi_poll_new(pa_mainloop_api
*m
) {
176 p
= pa_xnew(pa_avahi_poll
, 1);
179 p
->api
.watch_new
= watch_new
;
180 p
->api
.watch_update
= watch_update
;
181 p
->api
.watch_get_events
= watch_get_events
;
182 p
->api
.watch_free
= watch_free
;
183 p
->api
.timeout_new
= timeout_new
;
184 p
->api
.timeout_update
= timeout_update
;
185 p
->api
.timeout_free
= timeout_free
;
191 void pa_avahi_poll_free(AvahiPoll
*api
) {