diff options
author | Lennart Poettering <lennart@poettering.net> | 2007-09-18 19:52:45 +0000 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2007-09-18 19:52:45 +0000 |
commit | eb23601bb7771bce74e6b87a222b174660e86a0d (patch) | |
tree | 7a87005ca58fe583907d9f838d691c661546cfb0 | |
parent | 8fdf054e686b7bc488a510029a7b216c6aeaa50b (diff) |
bug fixes for module-rtp-recv
git-svn-id: file:///home/lennart/svn/public/pulseaudio/branches/lennart@1858 fefdeb5f-60dc-0310-8127-8f9354f1896f
-rw-r--r-- | src/modules/rtp/module-rtp-recv.c | 31 |
1 files changed, 22 insertions, 9 deletions
diff --git a/src/modules/rtp/module-rtp-recv.c b/src/modules/rtp/module-rtp-recv.c index f5e9c3c2..62be53ff 100644 --- a/src/modules/rtp/module-rtp-recv.c +++ b/src/modules/rtp/module-rtp-recv.c @@ -163,9 +163,22 @@ static int rtpoll_work_cb(pa_rtpoll_item *i) { int64_t k, j, delta; struct timespec now; struct session *s; - + struct pollfd *p; + pa_assert_se(s = pa_rtpoll_item_get_userdata(i)); + p = pa_rtpoll_item_get_pollfd(i, NULL); + + if (p->revents & (POLLERR|POLLNVAL|POLLHUP|POLLOUT)) { + pa_log("poll() signalled bad revents."); + return -1; + } + + if ((p->revents & POLLIN) == 0) + return 0; + + p->revents = 0; + if (pa_rtp_recv(&s->rtp_context, &chunk, s->userdata->module->core->mempool) < 0) return 0; @@ -405,14 +418,14 @@ static void session_free(struct session *s) { pa_sink_input_unlink(s->sink_input); pa_sink_input_unref(s->sink_input); - pa_memblockq_free(s->memblockq); - pa_sdp_info_destroy(&s->sdp_info); - pa_rtp_context_destroy(&s->rtp_context); - PA_LLIST_REMOVE(struct session, s->userdata->sessions, s); pa_assert(s->userdata->n_sessions >= 1); s->userdata->n_sessions--; pa_hashmap_remove(s->userdata->by_origin, s->sdp_info.origin); + + pa_memblockq_free(s->memblockq); + pa_sdp_info_destroy(&s->sdp_info); + pa_rtp_context_destroy(&s->rtp_context); pa_xfree(s); } @@ -466,7 +479,7 @@ static void check_death_event_cb(pa_mainloop_api *m, pa_time_event *t, const str pa_assert(m); pa_assert(t); pa_assert(ptv); - pa_assert(s); + pa_assert(u); pa_rtclock_get(&now); @@ -530,14 +543,14 @@ int pa__init(pa_module*m) { m->userdata = u; u->module = m; u->sink_name = pa_xstrdup(pa_modargs_get_value(ma, "sink", NULL)); - u->n_sessions = 0; u->sap_event = m->core->mainloop->io_new(m->core->mainloop, fd, PA_IO_EVENT_INPUT, sap_event_cb, u); + pa_sap_context_init_recv(&u->sap_context, fd); + PA_LLIST_HEAD_INIT(struct session, u->sessions); + u->n_sessions = 0; u->by_origin = pa_hashmap_new(pa_idxset_string_hash_func, pa_idxset_string_compare_func); - pa_sap_context_init_recv(&u->sap_context, fd); - pa_gettimeofday(&tv); pa_timeval_add(&tv, DEATH_TIMEOUT * PA_USEC_PER_SEC); u->check_death_event = m->core->mainloop->time_new(m->core->mainloop, &tv, check_death_event_cb, u); |