123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566 |
- #include "precompile.h"
- #include "audiodtmfbridge.h"
- #include "audiolog.h"
- #include "audiortp.h"
- #include "audiocontext.h"
- static void process_frame(void *self)
- {
- int i;
- audiodtmfbridge_t *bridge = CONTAINING_RECORD(self, audiodtmfbridge_t, base);
- for (i = 0; i < 2; ++i) {
- audiortp_t *src;
- audiortp_t *dst;
-
- if (i == 0) {
- src = bridge->left_leg_stream;;
- dst = bridge->right_leg_stream;
- } else {
- src = bridge->right_leg_stream;
- dst = bridge->left_leg_stream;
- }
- if (src && (audiostream_get_direction(&src->base) & STREAM_DIR_READ)) {
- char tmp[MAX_DTMF];
- unsigned tmp_cnt;
- apr_status_t status;
- tmp_cnt = 0;
- status = audiortp_recv_dtmf(src, tmp, &tmp_cnt);
- if (status == APR_SUCCESS && tmp_cnt) {
- if (dst && (audiostream_get_direction(&dst->base) & STREAM_DIR_WRITE)) {
- status = audiortp_send_dtmf(dst, tmp, tmp_cnt);
- if (status != APR_SUCCESS) {
- audio_log_v(AUDIO_LOG_LEVEL_ERROR,"send dtmf failed");
- }
- }
- }
- }
- }
- }
- static audiodriver_vtbl_t g_driver_vtbl = {
- &process_frame,
- };
- apr_status_t audiodtmfbridge_create(apr_pool_t *pool,
- audioengine_t *engine,
- audiortp_t *left_stream,
- audiortp_t *right_stream,
- int mode,
- audiodtmfbridge_t **p_bridge)
- {
- audiodtmfbridge_t *bridge;
- bridge = apr_palloc(pool, sizeof(audiodtmfbridge_t));
- audiodriver_init(engine, &g_driver_vtbl, &bridge->base);
- bridge->left_leg_stream = left_stream;
- bridge->right_leg_stream = right_stream;
- bridge->mode = mode;
- *p_bridge = bridge;
- return APR_SUCCESS;
- }
- void audiodtmfbridge_destroy(audiodtmfbridge_t *bridge)
- {
-
- }
|