X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=ortp_recv.c;h=102fe9acb90c773d3d40c9d4939b02331c6ebe26;hp=fca470ed009962384ce324b274790ef02a433a63;hb=dded41e5bed40cca8876e1056351cc1dbab309d0;hpb=4b950b07a628025f62240ba385504431c216c9fa diff --git a/ortp_recv.c b/ortp_recv.c index fca470ed..102fe9ac 100644 --- a/ortp_recv.c +++ b/ortp_recv.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2007 Andre Noll + * Copyright (C) 2005-2008 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ @@ -11,6 +11,7 @@ #include "ortp.h" #include "list.h" #include "sched.h" +#include "ggo.h" #include "recv.h" #include "ortp_recv.cmdline.h" @@ -85,7 +86,7 @@ static int msg_to_buf(mblk_t *mp, char *buffer, int len) static void ortp_recv_pre_select(struct sched *s, struct task *t) { - struct receiver_node *rn = t->private_data; + struct receiver_node *rn = container_of(t, struct receiver_node, task); struct private_ortp_recv_data *pord = rn->private_data; struct timeval tmp; @@ -95,7 +96,6 @@ static void ortp_recv_pre_select(struct sched *s, struct task *t) } if (tv_diff(&s->timeout, &tmp, NULL) > 0) s->timeout = tmp; - t->ret = 1; } static void compute_next_chunk(unsigned chunk_time, @@ -114,7 +114,7 @@ static void compute_next_chunk(unsigned chunk_time, static void ortp_recv_post_select(__a_unused struct sched *s, struct task *t) { - struct receiver_node *rn = t->private_data; + struct receiver_node *rn = container_of(t, struct receiver_node, task); struct private_ortp_recv_data *pord = rn->private_data; mblk_t *mp; int packet_type, stream_type; @@ -123,12 +123,10 @@ static void ortp_recv_post_select(__a_unused struct sched *s, struct task *t) size_t packet_size; // PARA_INFO_LOG("rn: %p, pord: %p, session: %p\n", rn, pord, pord->session); - t->ret = -E_ORTP_RECV_EOF; - if (rn->output_eof && *rn->output_eof) { - rn->eof = 1; + if (rn->output_error && *rn->output_error < 0) { + t->error = *rn->output_error; return; } - t->ret = 1; if (pord->start.tv_sec) if (tv_diff(now, &pord->next_chunk, NULL) < 0) return; @@ -138,26 +136,25 @@ static void ortp_recv_post_select(__a_unused struct sched *s, struct task *t) // PARA_INFO_LOG("nope, chunk_ts = %d, loaded: %d, bad: %d\n", // pord->timestamp, rn->loaded, pord->c_bad); pord->c_bad++; - t->ret = -E_TOO_MANY_BAD_CHUNKS; - if ((pord->c_bad > 5000 && pord->start.tv_sec) || pord->c_bad > 10000) + if ((pord->c_bad > 5000 && pord->start.tv_sec) || pord->c_bad > 10000) { + t->error = -E_TOO_MANY_BAD_CHUNKS; return; - t->ret = 1; + } tv_add(now, &min_delay, &pord->next_chunk); return; } /* okay, we have a chunk of data */ if (!pord->start.tv_sec) pord->start = *now; - t->ret = msg_to_buf(mp, tmpbuf, CHUNK_SIZE); - if (t->ret < ORTP_AUDIO_HEADER_LEN) { - rn->eof = 1; - if (t->ret < 0) - t->ret = -E_MSG_TO_BUF; + t->error = msg_to_buf(mp, tmpbuf, CHUNK_SIZE); + if (t->error < ORTP_AUDIO_HEADER_LEN) { + if (t->error < 0) + t->error = -E_MSG_TO_BUF; else - t->ret = -E_ORTP_RECV_EOF; + t->error = -E_ORTP_RECV_EOF; goto err_out; } - packet_size = t->ret; + packet_size = t->error; packet_type = READ_PACKET_TYPE(tmpbuf); stream_type = READ_STREAM_TYPE(tmpbuf); chunk_time = READ_CHUNK_TIME(tmpbuf); @@ -168,8 +165,7 @@ static void ortp_recv_post_select(__a_unused struct sched *s, struct task *t) switch (packet_type) { unsigned header_len, payload_len; case ORTP_EOF: - rn->eof = 1; - t->ret = -E_ORTP_RECV_EOF; + t->error = -E_RECV_EOF; goto err_out; case ORTP_BOF: PARA_INFO_LOG("bof (%zu)\n", packet_size); @@ -179,9 +175,10 @@ static void ortp_recv_post_select(__a_unused struct sched *s, struct task *t) if (!pord->have_header && stream_type) /* can't use the data, wait for header */ goto success; - t->ret = -E_OVERRUN; - if (packet_size + rn->loaded >= CHUNK_SIZE + ORTP_AUDIO_HEADER_LEN) + if (packet_size + rn->loaded >= CHUNK_SIZE + ORTP_AUDIO_HEADER_LEN) { + t->error = -E_OVERRUN; goto err_out; + } if (packet_size > ORTP_AUDIO_HEADER_LEN) { memcpy(rn->buf + rn->loaded, tmpbuf + ORTP_AUDIO_HEADER_LEN, packet_size - ORTP_AUDIO_HEADER_LEN); @@ -199,21 +196,22 @@ static void ortp_recv_post_select(__a_unused struct sched *s, struct task *t) rn->loaded = packet_size - ORTP_AUDIO_HEADER_LEN; goto success; } - t->ret = -E_INVALID_HEADER; - if (header_len + ORTP_AUDIO_HEADER_LEN > packet_size) + if (header_len + ORTP_AUDIO_HEADER_LEN > packet_size) { + t->error = -E_INVALID_HEADER; goto err_out; + } payload_len = packet_size - ORTP_AUDIO_HEADER_LEN - header_len; - t->ret = -E_OVERRUN; - if (rn->loaded + payload_len > CHUNK_SIZE) + if (rn->loaded + payload_len > CHUNK_SIZE) { + t->error = -E_OVERRUN; goto err_out; + } if (payload_len) memcpy(rn->buf + rn->loaded, tmpbuf + (packet_size - payload_len), payload_len); rn->loaded += payload_len; - goto success; } success: - t->ret = 1; + t->error = 0; freemsg(mp); if (pord->c_bad) { pord->c_bad = 0; @@ -222,7 +220,6 @@ success: compute_next_chunk(chunk_time, pord); return; err_out: - rn->eof = 1; freemsg(mp); } @@ -284,12 +281,19 @@ static int ortp_recv_open(struct receiver_node *rn) */ void ortp_recv_init(struct receiver *r) { + struct ortp_recv_args_info dummy; + + ortp_recv_cmdline_parser_init(&dummy); r->shutdown = ortp_shutdown; r->open = ortp_recv_open; r->close = ortp_recv_close; r->pre_select = ortp_recv_pre_select; r->post_select = ortp_recv_post_select; r->parse_config = ortp_recv_parse_config; + r->help = (struct ggo_help) { + .short_help = ortp_recv_args_info_help, + .detailed_help = ortp_recv_args_info_detailed_help + }; ortp_init(); }