summaryrefslogtreecommitdiffstats
path: root/server/snd_worker.c
diff options
context:
space:
mode:
authorGerd Hoffmann <kraxel@redhat.com>2010-03-29 13:28:21 +0200
committerGerd Hoffmann <kraxel@redhat.com>2010-05-19 11:22:06 +0200
commite8a2cca02675be797e76bc51acda87eadf52e790 (patch)
tree9eaf858e05ba752c1705b2320d8961cb06c2c520 /server/snd_worker.c
parent614fa009036abc6e376339ecd97d49a674615af4 (diff)
downloadspice-e8a2cca02675be797e76bc51acda87eadf52e790.tar.gz
spice-e8a2cca02675be797e76bc51acda87eadf52e790.tar.xz
spice-e8a2cca02675be797e76bc51acda87eadf52e790.zip
new watch api: switch sound
Diffstat (limited to 'server/snd_worker.c')
-rw-r--r--server/snd_worker.c32
1 files changed, 21 insertions, 11 deletions
diff --git a/server/snd_worker.c b/server/snd_worker.c
index 66dc8560..d5f5f377 100644
--- a/server/snd_worker.c
+++ b/server/snd_worker.c
@@ -239,7 +239,8 @@ static void snd_disconnect_channel(SndChannel *channel)
channel->cleanup(channel);
worker = channel->worker;
worker->connection = NULL;
- core->set_file_handlers(core, channel->peer->socket, NULL, NULL, NULL);
+ core->watch_remove(channel->peer->watch);
+ channel->peer->watch = NULL;
channel->peer->cb_free(channel->peer);
free(channel);
}
@@ -287,10 +288,7 @@ static int snd_send_data(SndChannel *channel)
if (channel->blocked) {
channel->blocked = FALSE;
- if (core->set_file_handlers(core, channel->peer->socket, snd_receive,
- NULL, channel) == -1) {
- red_printf("qemu_set_fd_handler failed");
- }
+ core->watch_update_mask(channel->peer->watch, SPICE_WATCH_EVENT_READ);
}
break;
}
@@ -300,10 +298,8 @@ static int snd_send_data(SndChannel *channel)
switch (errno) {
case EAGAIN:
channel->blocked = TRUE;
- if (core->set_file_handlers(core, channel->peer->socket, snd_receive,
- channel->send_messages, channel) == -1) {
- red_printf("qemu_set_fd_handler failed");
- }
+ core->watch_update_mask(channel->peer->watch, SPICE_WATCH_EVENT_READ |
+ SPICE_WATCH_EVENT_WRITE);
return FALSE;
case EINTR:
break;
@@ -492,6 +488,18 @@ static void snd_receive(void* data)
}
}
+static void snd_event(int fd, int event, void *data)
+{
+ SndChannel *channel = data;
+
+ if (event & SPICE_WATCH_EVENT_READ) {
+ snd_receive(channel);
+ }
+ if (event & SPICE_WATCH_EVENT_WRITE) {
+ channel->send_messages(channel);
+ }
+}
+
static inline void __snd_add_buf(SndChannel *channel, void *data, uint32_t size)
{
int pos = channel->send_data.n_bufs++;
@@ -802,8 +810,10 @@ static SndChannel *__new_channel(SndWorker *worker, int size, RedsStreamContext
channel->recive_data.now = channel->recive_data.buf;
channel->recive_data.end = channel->recive_data.buf + sizeof(channel->recive_data.buf);
- if (core->set_file_handlers(core, peer->socket, snd_receive, NULL, channel) == -1) {
- red_printf("qemu_set_fd_handler failed, %s", strerror(errno));
+ peer->watch = core->watch_add(peer->socket, SPICE_WATCH_EVENT_READ,
+ snd_event, channel);
+ if (peer->watch == NULL) {
+ red_printf("watch_add failed, %s", strerror(errno));
goto error2;
}