root/src/testr2.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. FIO_SIGNAL_CB_FUNCTION
  2. stop_test
  3. main

   1 #include "freetdm.h"
   2 #include <signal.h>
   3 #include <stdlib.h>
   4 
   5 static volatile int running = 0;
   6 static ftdm_mutex_t *the_mutex = NULL;
   7 static ftdm_channel_t *fchan = NULL;
   8 static ftdm_channel_indication_t indication = FTDM_CHANNEL_INDICATE_NONE;
   9 
  10 static FIO_SIGNAL_CB_FUNCTION(on_r2_signal)
  11 {
  12         int chanid = ftdm_channel_get_ph_id(sigmsg->channel);
  13         ftdm_log(FTDM_LOG_DEBUG, "Got R2 channel sig [%s] in channel\n", ftdm_signal_event2str(sigmsg->event_id), chanid);
  14         switch (sigmsg->event_id) {
  15         case FTDM_SIGEVENT_START:
  16                 {
  17                         ftdm_mutex_lock(the_mutex);
  18                         if (!fchan) {
  19                                 fchan = sigmsg->channel;
  20                                 indication = FTDM_CHANNEL_INDICATE_PROCEED;
  21                         }
  22                         ftdm_mutex_unlock(the_mutex);
  23                 }
  24                 break;
  25         case FTDM_SIGEVENT_INDICATION_COMPLETED:
  26                 {
  27                         ftdm_channel_indication_t ind = FTDM_CHANNEL_INDICATE_NONE;
  28                         if (sigmsg->ev_data.indication_completed.indication == FTDM_CHANNEL_INDICATE_PROCEED) {
  29                                 ftdm_log(FTDM_LOG_DEBUG, "Proceed indication result = %d\n", sigmsg->ev_data.indication_completed.status);
  30                                 ind = FTDM_CHANNEL_INDICATE_PROGRESS;
  31                         } else if (sigmsg->ev_data.indication_completed.indication == FTDM_CHANNEL_INDICATE_PROGRESS) {
  32                                 ftdm_log(FTDM_LOG_DEBUG, "Progress indication result = %d\n", sigmsg->ev_data.indication_completed.status);
  33                                 ind = FTDM_CHANNEL_INDICATE_PROGRESS_MEDIA;
  34                         } else if (sigmsg->ev_data.indication_completed.indication == FTDM_CHANNEL_INDICATE_PROGRESS_MEDIA) {
  35                                 ftdm_log(FTDM_LOG_DEBUG, "Progress media indication result = %d\n", sigmsg->ev_data.indication_completed.status);
  36                                 ind = FTDM_CHANNEL_INDICATE_ANSWER;
  37                         } else if (sigmsg->ev_data.indication_completed.indication == FTDM_CHANNEL_INDICATE_ANSWER) {
  38                                 ftdm_log(FTDM_LOG_DEBUG, "Answer indication result = %d\n", sigmsg->ev_data.indication_completed.status);
  39                         } else {
  40                                 ftdm_log(FTDM_LOG_DEBUG, "Unexpected indication, result = %d\n", sigmsg->ev_data.indication_completed.status);
  41                                 exit(1);
  42                         }
  43                         ftdm_mutex_lock(the_mutex);
  44                         if (fchan) {
  45                                 indication = ind;
  46                         }
  47                         ftdm_mutex_unlock(the_mutex);
  48                 }
  49                 break;
  50         case FTDM_SIGEVENT_STOP:
  51                 {
  52                         ftdm_channel_call_hangup(sigmsg->channel);
  53                 }
  54                 break;
  55         case FTDM_SIGEVENT_RELEASED:
  56                 {
  57                         ftdm_mutex_lock(the_mutex);
  58                         if (fchan && fchan == sigmsg->channel) {
  59                                 fchan = NULL;
  60                         }
  61                         ftdm_mutex_unlock(the_mutex);
  62                 }
  63                 break;
  64         default:
  65                 break;
  66         }
  67         return FTDM_SUCCESS;
  68 }
  69 
  70 static void stop_test(int sig)
  71 {
  72         running = 0;
  73 }
  74 
  75 int main(int argc, char *argv[])
  76 {
  77         ftdm_span_t *span;
  78         ftdm_conf_parameter_t parameters[20];
  79         
  80         ftdm_mutex_create(&the_mutex);
  81 
  82         if (argc < 2) {
  83                 printf("umm no\n");
  84                 exit(1);
  85         }
  86 
  87         ftdm_global_set_default_logger(FTDM_LOG_LEVEL_DEBUG);
  88 
  89         if (ftdm_global_init() != FTDM_SUCCESS) {
  90                 fprintf(stderr, "Error loading FreeTDM\n");
  91                 exit(1);
  92         }
  93 
  94         ftdm_global_configuration();
  95 
  96         printf("FreeTDM loaded\n");
  97 
  98         if (ftdm_span_find_by_name(argv[1], &span) != FTDM_SUCCESS) {
  99                 fprintf(stderr, "Error finding FreeTDM span %s\n", argv[1]);
 100                 goto done;
 101         }
 102         
 103         /* testing non-blocking operation */
 104         //ftdm_span_set_blocking_mode(span, FTDM_FALSE);
 105 
 106         parameters[0].var = "variant";
 107         parameters[0].val = "br";
 108 
 109         parameters[1].var = "max_ani";
 110         parameters[1].val = "4";
 111 
 112         parameters[2].var = "max_dnis";
 113         parameters[2].val = "4";
 114 
 115         parameters[3].var = "logging";
 116         parameters[3].val = "all";
 117 
 118         parameters[4].var = NULL;
 119         parameters[4].val = NULL;
 120 
 121         if (ftdm_configure_span_signaling(span, "r2", on_r2_signal, parameters) == FTDM_SUCCESS) {
 122                 ftdm_span_start(span);
 123         } else {
 124                 fprintf(stderr, "Error starting R2 span\n");
 125                 goto done;
 126         }
 127 
 128         running = 1;
 129         signal(SIGINT, stop_test);
 130         while(running) {
 131                 ftdm_sleep(20);
 132                 if (fchan && indication != FTDM_CHANNEL_INDICATE_NONE) {
 133                         ftdm_channel_t *lchan = NULL;
 134                         ftdm_channel_indication_t ind = FTDM_CHANNEL_INDICATE_NONE;
 135                         ftdm_time_t start, stop, diff;
 136 
 137                         ftdm_mutex_lock(the_mutex);
 138                         ind = indication;
 139                         indication = FTDM_CHANNEL_INDICATE_NONE;
 140                         lchan = fchan;
 141                         ftdm_mutex_unlock(the_mutex);
 142 
 143                         start = ftdm_current_time_in_ms();
 144                         ftdm_channel_call_indicate(lchan, ind);
 145                         stop = ftdm_current_time_in_ms();
 146                         diff = stop - start;
 147                         ftdm_log(FTDM_LOG_DEBUG, "Setting indication %s took %llums\n", 
 148                                         ftdm_channel_indication2str(ind), diff);
 149                 }
 150         }
 151 
 152 done:
 153 
 154         ftdm_global_destroy();
 155 
 156         return 0;
 157 }
 158 
 159 /* For Emacs:
 160  * Local Variables:
 161  * mode:c
 162  * indent-tabs-mode:t
 163  * tab-width:4
 164  * c-basic-offset:4
 165  * End:
 166  * For VIM:
 167  * vim:set softtabstop=4 shiftwidth=4 tabstop=4:
 168  */

/* [<][>][^][v][top][bottom][index][help] */