]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
updated ozmod_wanpipe to use new libsangoma API
authorMoises Silva <moy@sangoma.com>
Wed, 17 Jun 2009 18:41:30 +0000 (18:41 +0000)
committerMoises Silva <moy@sangoma.com>
Wed, 17 Jun 2009 18:41:30 +0000 (18:41 +0000)
git-svn-id: http://svn.openzap.org/svn/openzap/trunk@747 a93c3328-9c30-0410-af19-c9cd2b2d52af

libs/openzap/src/ozmod/ozmod_wanpipe/ozmod_wanpipe.c

index 9dcd6e5ae2c78382fd7793853d96e9f555658f90..e806a2f679c4d91ab15567ea5d09ed4abd3a761f 100644 (file)
 #define sangoma_create_socket_intr sangoma_open_api_span_chan
 #endif
 
+/*! Starting with lbisangoma 3 we can use it, previous versions dont really work so we default to using the old stuff */
+#if defined(LIBSANGOMA_VERSION) && LIBSANGOMA_VERSION_CODE < LIBSANGOMA_VERSION(3,0,0)
+#undef LIBSANGOMA_VERSION
+#endif
+
 /**
  * \brief Wanpipe flags
  */
@@ -98,27 +103,31 @@ ZIO_SPAN_NEXT_EVENT_FUNCTION(wanpipe_next_event);
  * so we can have one analong handler thread that will deal with all the idle analog channels for events
  * the alternative would be for the driver to provide one socket for all of the oob events for all analog channels
  */
-static __inline__ int tdmv_api_wait_socket(sng_fd_t fd, int timeout, int *flags)
+static __inline__ int tdmv_api_wait_socket(zap_channel_t *zchan, int timeout, int *flags)
 {
        
 #ifdef LIBSANGOMA_VERSION
        int err;
-       sangoma_wait_obj_t sangoma_wait_obj;
-
-       sangoma_init_wait_obj(&sangoma_wait_obj, fd, 1, 1, *flags, SANGOMA_WAIT_OBJ);
-
-       err=sangoma_socket_waitfor_many(&sangoma_wait_obj,1 , timeout);
-       if (err > 0) {
-               *flags=sangoma_wait_obj.flags_out;
-       }
-       return err;
+    uint32_t inflags = *flags;
+    uint32_t outflags = 0;
+       sangoma_wait_obj_t *sangoma_wait_obj = zchan->mod_data;
 
+       err = sangoma_waitfor(sangoma_wait_obj, inflags, &outflags, timeout);
+       *flags = 0;
+    if (err == SANG_STATUS_SUCCESS) {
+        *flags = outflags;
+        err = 1; /* ideally should be the number of file descriptors with something to read */
+    }
+    if (err == SANG_STATUS_APIPOLL_TIMEOUT) {
+        err = 0;
+    }
+    return err;
 #else
        struct pollfd pfds[1];
     int res;
 
     memset(&pfds[0], 0, sizeof(pfds[0]));
-    pfds[0].fd = fd;
+    pfds[0].fd = zchan->sockfd;
     pfds[0].events = *flags;
     res = poll(pfds, 1, timeout);
        *flags = 0;
@@ -200,6 +209,18 @@ static unsigned wp_open_range(zap_span_t *span, unsigned spanno, unsigned start,
                
                if (sockfd != WP_INVALID_SOCKET && zap_span_add_channel(span, sockfd, type, &chan) == ZAP_SUCCESS) {
                        wanpipe_tdm_api_t tdm_api;
+#ifdef LIBSANGOMA_VERSION
+            sangoma_status_t sangstatus;
+                       sangoma_wait_obj_t *sangoma_wait_obj;
+
+            sangstatus = sangoma_wait_obj_create(&sangoma_wait_obj, sockfd, SANGOMA_DEVICE_WAIT_OBJ);
+            if (sangstatus != SANG_STATUS_SUCCESS) {
+                           zap_log(ZAP_LOG_ERROR, "failure create waitable object for s%dc%d\n", spanno, x);
+                continue;
+            }
+                       chan->mod_data = sangoma_wait_obj;
+#endif
+
                        memset(&tdm_api,0,sizeof(tdm_api));
                        
                        chan->physical_span_id = spanno;
@@ -211,7 +232,7 @@ static unsigned wp_open_range(zap_span_t *span, unsigned spanno, unsigned start,
                                
                                dtmf = "software";
 
-                               /* FIXME: Handle Error Conditino Check for return code */
+                               /* FIXME: Handle Error Condition Check for return code */
                                err= sangoma_tdm_get_hw_coding(chan->sockfd, &tdm_api);
 
                                if (tdm_api.wp_tdm_cmd.hw_tdm_coding) {
@@ -606,7 +627,7 @@ static ZIO_WAIT_FUNCTION(wanpipe_wait)
                inflags |= POLLPRI;
        }
 
-       result = tdmv_api_wait_socket(zchan->sockfd, to, &inflags);
+       result = tdmv_api_wait_socket(zchan, to, &inflags);
 
        *flags = ZAP_NO_FLAGS;
 
@@ -643,26 +664,33 @@ static ZIO_WAIT_FUNCTION(wanpipe_wait)
 ZIO_SPAN_POLL_EVENT_FUNCTION(wanpipe_poll_event)
 {
 #ifdef LIBSANGOMA_VERSION
-       sangoma_wait_obj_t pfds[ZAP_MAX_CHANNELS_SPAN];
+    sangoma_status_t sangstatus;
+       sangoma_wait_obj_t *pfds[ZAP_MAX_CHANNELS_SPAN] = { 0 };
+    uint32_t inflags[ZAP_MAX_CHANNELS_SPAN];
+    uint32_t outflags[ZAP_MAX_CHANNELS_SPAN];
 #else
        struct pollfd pfds[ZAP_MAX_CHANNELS_SPAN];
 #endif
 
        uint32_t i, j = 0, k = 0, l = 0;
-       int objects=0;
        int r;
        
        for(i = 1; i <= span->chan_count; i++) {
                zap_channel_t *zchan = span->channels[i];
 
+
 #ifdef LIBSANGOMA_VERSION
-               sangoma_init_wait_obj(&pfds[j], zchan->sockfd , 1, 1, POLLPRI, SANGOMA_WAIT_OBJ);
+               if (!zchan->mod_data) {
+                       continue; /* should never happen but happens when shutting down */
+               }
+               pfds[j] = zchan->mod_data;
+        inflags[j] = POLLPRI;
 #else
                memset(&pfds[j], 0, sizeof(pfds[j]));
                pfds[j].fd = span->channels[i]->sockfd;
                pfds[j].events = POLLPRI;
 #endif
-               objects++;
+
                /* The driver probably should be able to do this wink/flash/ringing by itself this is sort of a hack to make it work! */
 
                if (zap_test_flag(zchan, ZAP_CHANNEL_WINK) || zap_test_flag(zchan, ZAP_CHANNEL_FLASH)) {
@@ -703,7 +731,14 @@ ZIO_SPAN_POLL_EVENT_FUNCTION(wanpipe_poll_event)
                ms = l;
        }
 #ifdef LIBSANGOMA_VERSION
-       r = sangoma_socket_waitfor_many(pfds,objects,ms);
+       sangstatus = sangoma_waitfor_many(pfds, inflags, outflags, j, ms);
+    if (SANG_STATUS_APIPOLL_TIMEOUT == sangstatus) {
+        r = 0;
+    } else if (SANG_STATUS_SUCCESS == sangstatus) {
+        r = 1; /* hopefully we never need how many changed -_- */
+    } else {
+        r = -1;
+    }
 #else
        r = poll(pfds, j, ms);
 #endif
@@ -719,7 +754,7 @@ ZIO_SPAN_POLL_EVENT_FUNCTION(wanpipe_poll_event)
                zap_channel_t *zchan = span->channels[i];
 
 #ifdef LIBSANGOMA_VERSION
-               if (pfds[i-1].flags_out & POLLPRI) {
+               if (outflags[i-1] & POLLPRI) {
 #else
                if (pfds[i-1].revents & POLLPRI) {
 #endif
@@ -935,6 +970,14 @@ ZIO_SPAN_NEXT_EVENT_FUNCTION(wanpipe_next_event)
  */
 static ZIO_CHANNEL_DESTROY_FUNCTION(wanpipe_channel_destroy)
 {
+       sangoma_wait_obj_t *sangoma_wait_obj;
+
+       if (zchan->mod_data) {
+               sangoma_wait_obj = zchan->mod_data;
+               zchan->mod_data = NULL;
+               sangoma_wait_obj_delete(&sangoma_wait_obj);
+       }
+
        if (zchan->sockfd > -1) {
                close(zchan->sockfd);
                zchan->sockfd = WP_INVALID_SOCKET;