Exemplo n.º 1
0
int audio_alloc(struct audio **ap, const struct config *cfg,
		struct call *call, struct sdp_session *sdp_sess, int label,
		const struct mnat *mnat, struct mnat_sess *mnat_sess,
		const struct menc *menc, struct menc_sess *menc_sess,
		uint32_t ptime, const struct list *aucodecl,
		audio_event_h *eventh, audio_err_h *errh, void *arg)
{
	struct audio *a;
	struct autx *tx;
	struct aurx *rx;
	struct le *le;
	int err;

	if (!ap || !cfg)
		return EINVAL;

	a = mem_zalloc(sizeof(*a), audio_destructor);
	if (!a)
		return ENOMEM;

	MAGIC_INIT(a);

	a->cfg = cfg->audio;
	tx = &a->tx;
	rx = &a->rx;

	err = stream_alloc(&a->strm, &cfg->avt, call, sdp_sess,
			   "audio", label,
			   mnat, mnat_sess, menc, menc_sess,
			   stream_recv_handler, NULL, a);
	if (err)
		goto out;

	stream_set_bw(a->strm, AUDIO_BANDWIDTH);

	err = sdp_media_set_lattr(stream_sdpmedia(a->strm), true,
				  "ptime", "%u", ptime);
	if (err)
		goto out;

	/* Audio codecs */
	for (le = list_head(aucodecl); le; le = le->next) {
		err = add_audio_codec(a, stream_sdpmedia(a->strm), le->data);
		if (err)
			goto out;
	}

	tx->mb = mbuf_alloc(STREAM_PRESZ + 4096);
	tx->sampv = mem_zalloc(AUDIO_SAMPSZ * 2, NULL);
	rx->sampv = mem_zalloc(AUDIO_SAMPSZ * 2, NULL);
	if (!tx->mb || !tx->sampv || !rx->sampv) {
		err = ENOMEM;
		goto out;
	}

	err = telev_alloc(&a->telev, TELEV_PTIME);
	if (err)
		goto out;

	err = add_telev_codec(a);
	if (err)
		goto out;

	tx->ptime  = ptime;
	tx->ts     = 160;
	tx->marker = true;

	rx->pt     = -1;
	rx->ptime  = ptime;

	a->eventh    = eventh;
	a->errh      = errh;
	a->arg       = arg;

	if (a->cfg.txmode == AUDIO_MODE_TMR)
		tmr_init(&tx->u.tmr);

 out:
	if (err)
		mem_deref(a);
	else
		*ap = a;

	return err;
}
Exemplo n.º 2
0
int test_telev(void)
{
	static const char digits[] = "1234567890ABCD*#";
	struct telev *tlv = NULL;
	struct mbuf *mb;
	bool marker, expect_end = false;
	char digit;
	size_t i;
	int err;

	mb = mbuf_alloc(512);
	if (!mb)
		return ENOMEM;

	err = telev_alloc(&tlv, 1);
	if (err)
		goto out;

	/* Encode all digits */
	for (i=0; i<strlen(digits) && !err; i++) {
		digit = telev_digit2code(digits[i]);
		err |= telev_send(tlv, digit, false);
		err |= telev_send(tlv, digit, true);
	}
	if (err)
		goto out;

	while (0 == telev_poll(tlv, &marker, mb))
		;

	/* Decode all digits */
	mb->pos = 0;
	i = 0;
	while (mbuf_get_left(mb) && i<strlen(digits)) {
		int event;
		bool end;

		if (telev_recv(tlv, mb, &event, &end))
			continue;

		digit = telev_code2digit(event);

		if (digits[i] != digit) {
			(void)re_fprintf(stderr, "telev: expect %c, got %c\n",
					 digits[i], digit);
			err = EBADMSG;
			break;
		}

		if (!expect_end != !end) {
			err = EBADMSG;
			break;
		}

		expect_end = !end;
		if (end)
			++i;
	}

	if (i != strlen(digits))
		err = EBADMSG;

 out:
	mem_deref(tlv);
	mem_deref(mb);
	return err;
}