Mercurial > hg > audiostuff
diff spandsp-0.0.3/spandsp-0.0.3/tests/ip_network_model.c @ 5:f762bf195c4b
import spandsp-0.0.3
author | Peter Meerwald <pmeerw@cosy.sbg.ac.at> |
---|---|
date | Fri, 25 Jun 2010 16:00:21 +0200 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/spandsp-0.0.3/spandsp-0.0.3/tests/ip_network_model.c Fri Jun 25 16:00:21 2010 +0200 @@ -0,0 +1,149 @@ +/* + * SpanDSP - a series of DSP components for telephony + * + * ip_network_model.c - Model an IP networks latency, jitter and loss. + * + * Written by Steve Underwood <steveu@coppice.org> + * + * Copyright (C) 2006 Steve Underwood + * + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2, as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + * $Id: ip_network_model.c,v 1.4 2006/11/19 14:07:27 steveu Exp $ + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <stdlib.h> +#include <unistd.h> +#include <inttypes.h> +#include <string.h> +#include <time.h> +#include <stdio.h> +#include <fcntl.h> +#include <audiofile.h> +#include <tiffio.h> +#if defined(HAVE_TGMATH_H) +#include <tgmath.h> +#endif +#if defined(HAVE_MATH_H) +#define GEN_CONST +#include <math.h> +#endif + +#include "spandsp.h" + +#include "ip_network_model.h" + +#if !defined(NULL) +#define NULL (void *) 0 +#endif + +void ip_network_model_send(ip_network_model_state_t *s, + int seq_no, + int count, + const uint8_t *buf, + int len) +{ + int delay[2]; + int i; + + for (i = 0; i < count; i++) + { + if (rand()%1000000 >= s->packet_loss) + { + delay[0] = s->current_samples + s->bulk_delay + (rand()%s->jitter); + delay[1] = seq_no; + queue_write_msg(&s->packet_queue, (uint8_t *) delay, sizeof(delay)); + queue_write_msg(&s->packet_queue, buf, len); + } + else + { + fprintf(stderr, "Dropping packet - seq %d\n", seq_no); + } + } +} +/*- End of function --------------------------------------------------------*/ + +int ip_network_model_get(ip_network_model_state_t *s, + int time_step, + uint8_t *msg, + int max_len, + int *seq_no) +{ + int len; + + s->current_samples += time_step; + + if (s->delay[0] < 0) + { + /* Wait for a new packet */ + if (queue_empty(&s->packet_queue)) + return -1; + len = queue_read_msg(&s->packet_queue, (uint8_t *) s->delay, sizeof(s->delay)); + if (len != sizeof(s->delay)) + return -1; + } + *seq_no = s->delay[1]; + /* Wait for the appropriate time */ + if (s->delay[0] > s->current_samples) + return -1; + /* Wait for a message */ + if (queue_empty(&s->packet_queue)) + return -1; + s->delay[0] = -1; + s->delay[1] = -1; + len = queue_read_msg(&s->packet_queue, msg, max_len); + return len; +} +/*- End of function --------------------------------------------------------*/ + +ip_network_model_state_t *ip_network_model_init(int bulk_delay, + int jitter, + int loss) +{ + ip_network_model_state_t *s; + + if ((s = (ip_network_model_state_t *) malloc(sizeof(*s))) == NULL) + return NULL; + memset(s, 0, sizeof(*s)); + + s->bulk_delay = bulk_delay; + s->jitter = jitter; + s->packet_loss = loss; + + s->delay[0] = -1; + s->delay[1] = -1; + + if (queue_create(&s->packet_queue, 32768, QUEUE_WRITE_ATOMIC | QUEUE_READ_ATOMIC) < 0) + { + free(s); + return NULL; + } + return s; +} +/*- End of function --------------------------------------------------------*/ + +int ip_network_model_release(ip_network_model_state_t *s) +{ + queue_delete(&s->packet_queue); + free(s); + return 0; +} +/*- End of function --------------------------------------------------------*/ +/*- End of file ------------------------------------------------------------*/