audiodtmfbridge.c 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. #include "precompile.h"
  2. #include "audiodtmfbridge.h"
  3. #include "audiolog.h"
  4. #include "audiortp.h"
  5. #include "audiocontext.h"
  6. static void process_frame(void *self)
  7. {
  8. int i;
  9. audiodtmfbridge_t *bridge = CONTAINING_RECORD(self, audiodtmfbridge_t, base);
  10. for (i = 0; i < 2; ++i) {
  11. audiortp_t *src;
  12. audiortp_t *dst;
  13. if (i == 0) {
  14. src = bridge->left_leg_stream;;
  15. dst = bridge->right_leg_stream;
  16. } else {
  17. src = bridge->right_leg_stream;
  18. dst = bridge->left_leg_stream;
  19. }
  20. if (src && (audiostream_get_direction(&src->base) & STREAM_DIR_READ)) {
  21. char tmp[MAX_DTMF];
  22. unsigned tmp_cnt;
  23. apr_status_t status;
  24. tmp_cnt = 0;
  25. status = audiortp_recv_dtmf(src, tmp, &tmp_cnt);
  26. if (status == APR_SUCCESS && tmp_cnt) {
  27. if (dst && (audiostream_get_direction(&dst->base) & STREAM_DIR_WRITE)) {
  28. status = audiortp_send_dtmf(dst, tmp, tmp_cnt);
  29. if (status != APR_SUCCESS) {
  30. audio_log_v(AUDIO_LOG_LEVEL_ERROR,"send dtmf failed");
  31. }
  32. }
  33. }
  34. }
  35. }
  36. }
  37. static audiodriver_vtbl_t g_driver_vtbl = {
  38. &process_frame,
  39. };
  40. apr_status_t audiodtmfbridge_create(apr_pool_t *pool,
  41. audioengine_t *engine,
  42. audiortp_t *left_stream,
  43. audiortp_t *right_stream,
  44. int mode,
  45. audiodtmfbridge_t **p_bridge)
  46. {
  47. audiodtmfbridge_t *bridge;
  48. bridge = apr_palloc(pool, sizeof(audiodtmfbridge_t));
  49. audiodriver_init(engine, &g_driver_vtbl, &bridge->base);
  50. bridge->left_leg_stream = left_stream;
  51. bridge->right_leg_stream = right_stream;
  52. bridge->mode = mode;
  53. *p_bridge = bridge;
  54. return APR_SUCCESS;
  55. }
  56. void audiodtmfbridge_destroy(audiodtmfbridge_t *bridge)
  57. {
  58. }