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; }
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; }