2 This file is part of PulseAudio.
4 Copyright 2006 Lennart Poettering
6 PulseAudio is free software; you can redistribute it and/or modify
7 it under the terms of the GNU Lesser General Public License as
8 published by the Free Software Foundation; either version 2.1 of the
9 License, or (at your option) any later version.
11 PulseAudio is distributed in the hope that it will be useful, but
12 WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 General Public License for more details.
16 You should have received a copy of the GNU Lesser General Public
17 License along with PulseAudio; if not, write to the Free Software
18 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
26 #include <pulse/timeval.h>
27 #include <pulse/xmalloc.h>
29 #include <pulsecore/log.h>
30 #include <pulsecore/macro.h>
32 #include "avahi-wrap.h"
36 pa_mainloop_api
*mainloop
;
40 pa_io_event
*io_event
;
41 pa_avahi_poll
*avahi_poll
;
42 AvahiWatchEvent current_event
;
43 AvahiWatchCallback callback
;
47 static AvahiWatchEvent
translate_io_flags_back(pa_io_event_flags_t e
) {
49 (e
& PA_IO_EVENT_INPUT
? AVAHI_WATCH_IN
: 0) |
50 (e
& PA_IO_EVENT_OUTPUT
? AVAHI_WATCH_OUT
: 0) |
51 (e
& PA_IO_EVENT_ERROR
? AVAHI_WATCH_ERR
: 0) |
52 (e
& PA_IO_EVENT_HANGUP
? AVAHI_WATCH_HUP
: 0);
55 static pa_io_event_flags_t
translate_io_flags(AvahiWatchEvent e
) {
57 (e
& AVAHI_WATCH_IN
? PA_IO_EVENT_INPUT
: 0) |
58 (e
& AVAHI_WATCH_OUT
? PA_IO_EVENT_OUTPUT
: 0) |
59 (e
& AVAHI_WATCH_ERR
? PA_IO_EVENT_ERROR
: 0) |
60 (e
& AVAHI_WATCH_HUP
? PA_IO_EVENT_HANGUP
: 0);
63 static void watch_callback(pa_mainloop_api
*a
, pa_io_event
* e
, int fd
, pa_io_event_flags_t events
, void *userdata
) {
64 AvahiWatch
*w
= userdata
;
70 w
->current_event
= translate_io_flags_back(events
);
71 w
->callback(w
, fd
, w
->current_event
, w
->userdata
);
75 static AvahiWatch
* watch_new(const AvahiPoll
*api
, int fd
, AvahiWatchEvent event
, AvahiWatchCallback callback
, void *userdata
) {
82 pa_assert_se(p
= api
->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
*t
, void *userdata
) {
121 AvahiTimeout
*to
= userdata
;
126 to
->callback(to
, to
->userdata
);
129 static AvahiTimeout
* timeout_new(const AvahiPoll
*api
, const struct timeval
*tv
, AvahiTimeoutCallback callback
, void *userdata
) {
135 pa_assert_se(p
= api
->userdata
);
137 t
= pa_xnew(AvahiTimeout
, 1);
139 t
->callback
= callback
;
140 t
->userdata
= userdata
;
142 t
->time_event
= tv
? p
->mainloop
->time_new(p
->mainloop
, tv
, timeout_callback
, t
) : NULL
;
147 static void timeout_update(AvahiTimeout
*t
, const struct timeval
*tv
) {
151 if (t
->time_event
&& tv
)
152 t
->avahi_poll
->mainloop
->time_restart(t
->time_event
, tv
);
153 else if (!t
->time_event
&& tv
)
154 t
->time_event
= t
->avahi_poll
->mainloop
->time_new(t
->avahi_poll
->mainloop
, tv
, timeout_callback
, t
);
155 else if (t
->time_event
&& !tv
) {
156 t
->avahi_poll
->mainloop
->time_free(t
->time_event
);
157 t
->time_event
= NULL
;
161 static void timeout_free(AvahiTimeout
*t
) {
165 t
->avahi_poll
->mainloop
->time_free(t
->time_event
);
169 AvahiPoll
* pa_avahi_poll_new(pa_mainloop_api
*m
) {
174 p
= pa_xnew(pa_avahi_poll
, 1);
177 p
->api
.watch_new
= watch_new
;
178 p
->api
.watch_update
= watch_update
;
179 p
->api
.watch_get_events
= watch_get_events
;
180 p
->api
.watch_free
= watch_free
;
181 p
->api
.timeout_new
= timeout_new
;
182 p
->api
.timeout_update
= timeout_update
;
183 p
->api
.timeout_free
= timeout_free
;
189 void pa_avahi_poll_free(AvahiPoll
*api
) {
192 pa_assert_se(p
= api
->userdata
);