Author: gmaruzz Date: Mon Nov 10 00:56:20 2008 New Revision: 10307 Log: skypiax: first incoming call connected (answered by FS), no audio yet, crashes on FS shutdown Modified: freeswitch/branches/gmaruzz/src/mod/endpoints/mod_skypiax/mod_skypiax.c Modified: freeswitch/branches/gmaruzz/src/mod/endpoints/mod_skypiax/mod_skypiax.c ============================================================================== --- freeswitch/branches/gmaruzz/src/mod/endpoints/mod_skypiax/mod_skypiax.c (original) +++ freeswitch/branches/gmaruzz/src/mod/endpoints/mod_skypiax/mod_skypiax.c Mon Nov 10 00:56:20 2008 @@ -20,6 +20,56 @@ #define SKYPIAX_TMP_LOG NULL, (unsigned long)55, __LINE__, "none", -1, -2, -3 +/*********************************/ +#define AST_CAUSE_NORMAL 1 +/*********************************/ +#define AST_FRAME_DTMF 1 +/*********************************/ +#define AST_CONTROL_RINGING 1 +#define AST_CONTROL_ANSWER 2 + +/*********************************/ +#define AST_STATE_DOWN 1 +#define AST_STATE_RING 2 +#define AST_STATE_DIALING 3 +#define AST_STATE_BUSY 4 +#define AST_STATE_UP 5 +#define AST_STATE_RINGING 6 +#define AST_STATE_PRERING 7 +/*********************************/ +/* call flow from the device */ +#define CALLFLOW_CALL_IDLE AST_STATE_DOWN +#define CALLFLOW_INCOMING_RING AST_STATE_RING +#define CALLFLOW_CALL_DIALING AST_STATE_DIALING +#define CALLFLOW_CALL_LINEBUSY AST_STATE_BUSY +#define CALLFLOW_CALL_ACTIVE 300 +#define CALLFLOW_INCOMING_HANGUP 100 +#define CALLFLOW_CALL_RELEASED 101 +#define CALLFLOW_CALL_NOCARRIER 102 +#define CALLFLOW_CALL_INFLUX 103 +#define CALLFLOW_CALL_INCOMING 104 +#define CALLFLOW_CALL_FAILED 105 +#define CALLFLOW_CALL_NOSERVICE 106 +#define CALLFLOW_CALL_OUTGOINGRESTRICTED 107 +#define CALLFLOW_CALL_SECURITYFAIL 108 +#define CALLFLOW_CALL_NOANSWER 109 +#define CALLFLOW_STATUS_FINISHED 110 +#define CALLFLOW_STATUS_CANCELLED 111 +#define CALLFLOW_STATUS_FAILED 112 +#define CALLFLOW_STATUS_REFUSED 113 +#define CALLFLOW_STATUS_RINGING 114 +#define CALLFLOW_STATUS_INPROGRESS 115 +#define CALLFLOW_STATUS_UNPLACED 116 +#define CALLFLOW_STATUS_ROUTING 117 +#define CALLFLOW_STATUS_EARLYMEDIA 118 +#define AST_STATE_HANGUP_REQUESTED 200 + //FIXME CALLFLOW_INCOMING_CALLID to be removed +#define CALLFLOW_INCOMING_CALLID 1019 + +/*********************************/ + + + #define SKYPIAX_MAX_INTERFACES 64 SWITCH_MODULE_LOAD_FUNCTION(mod_skypiax_load); @@ -1110,6 +1160,511 @@ #endif /* SKYPE_THREAD */ +#define CONTROLDEV_THREAD +#ifdef CONTROLDEV_THREAD +#if 1 + +#define WANT_SKYPE_X11 +int skypiax_skype_write(struct skypiax_config *p, char *msg_to_skype) +{ +#ifdef __CYGWIN__ + static char acInputRow[1024]; + COPYDATASTRUCT oCopyData; + + if (option_debug > 100) { + DEBUGA_PBX("ENTERING FUNC\n", SKYPIAX_P_LOG); + } + sprintf(acInputRow, "%s", msg_to_skype); + if (option_debug > 1) + DEBUGA_SKYPE("acInputRow: |||%s||||\n", SKYPIAX_P_LOG, acInputRow); + /* send command to skype */ + oCopyData.dwData = 0; + oCopyData.lpData = acInputRow; + oCopyData.cbData = strlen(acInputRow) + 1; + if (oCopyData.cbData != 1) { + if (SendMessage + (p->AsteriskHandlesAst.win32_hGlobal_SkypeAPIWindowHandle, WM_COPYDATA, + (WPARAM) p->AsteriskHandlesAst.win32_hInit_MainWindowHandle, + (LPARAM) & oCopyData) == FALSE) { + ERRORA + ("Sending message failed - probably Skype crashed.\n\nPlease shutdown Skypiax (Asterisk), then restart Skype from the menu, then launch Skypiax and try again.\n", + SKYPIAX_P_LOG); + p->skype = 0; + p->skype_thread = AST_PTHREADT_NULL; + if (option_debug > 100) { + DEBUGA_PBX("EXITING FUNC\n", SKYPIAX_P_LOG); + } + return -1; + } + } +#else /* __CYGWIN__ */ +#ifdef WANT_SKYPE_X11 + struct AsteriskHandles *AsteriskHandlesAst; + + if (option_debug > 100) { + DEBUGA_PBX("ENTERING FUNC\n", SKYPIAX_P_LOG); + } + AsteriskHandlesAst = &p->AsteriskHandlesAst; + + DEBUGA_SKYPE("SENDING: |||%s||||\n", SKYPIAX_P_LOG, msg_to_skype); + + if (!skypiax_skype_send_message(AsteriskHandlesAst, msg_to_skype)) { + ERRORA + ("Sending message failed - probably Skype crashed.\n\nPlease shutdown Skypiax (Asterisk), then restart Skype from the menu, then launch Skypiax and try again.\n", + SKYPIAX_P_LOG); + //p->skype = 0; + //p->skype_thread = AST_PTHREADT_NULL; + if (option_debug > 100) { + DEBUGA_PBX("EXITING FUNC\n", SKYPIAX_P_LOG); + } + return -1; + } +#endif /* WANT_SKYPE_X11 */ +#endif /* __CYGWIN__ */ + + if (option_debug > 100) { + DEBUGA_PBX("EXITING FUNC\n", SKYPIAX_P_LOG); + } + return 0; + +} +#endif //0 + + +int skypiax_skype_read(struct skypiax_config *p) +{ + + char read_from_pipe[4096]; + char messaggio[4096]; + char messaggio_2[4096]; + char *buf, obj[512] = "", id[512] = "", prop[512] = "", value[512] = "", *where; + char **stringp = NULL; + int fd; + int rt; + fd_set fs; + struct timeval to; + int howmany, i, a; + + if (option_debug > 100) { + DEBUGA_PBX("ENTERING FUNC\n", SKYPIAX_P_LOG); + } + memset(read_from_pipe, 0, 4096); + memset(messaggio, 0, 4096); + memset(messaggio_2, 0, 4096); + + fd = p->AsteriskHandlesAst.fdesc[0]; + FD_ZERO(&fs); + FD_SET(fd, &fs); + to.tv_usec = 100; + to.tv_sec = 0; + rt = select(fd + 1, &fs, NULL, NULL, &to); + if (rt > 0) { + howmany = + read(p->AsteriskHandlesAst.fdesc[0], read_from_pipe, sizeof(read_from_pipe)); + + a = 0; + for (i = 0; i < howmany; i++) { + messaggio[a] = read_from_pipe[i]; + a++; + + if (read_from_pipe[i] == '\0') { + + if (option_debug > 1) + DEBUGA_SKYPE("read_skype: howmany=%d, i=%d, a=%d, |||%s||| \n", SKYPIAX_P_LOG, + howmany, i, a, messaggio); + +#if 0 //FIXME wat's the use of this? + if (!strcasecmp(messaggio, "ERROR 68")) { /* not yet protocol specified, + just authorized */ + NOTICA + ("Please give the Skype client authorization to be connected by Skypiax (and to not ask you again)\n", + SKYPIAX_P_LOG); + sleep(1); + skypiax_skype_write(p, "PROTOCOL 6"); + usleep(10000); + } +#endif + + if (!strncasecmp(messaggio, "ERROR 92 CALL", 12)) { + ERRORA + ("Skype got ERROR: |||%s|||, the number we called was not recognized\n", + SKYPIAX_P_LOG, messaggio); + p->skype_callflow = CALLFLOW_STATUS_FINISHED; + if (option_debug) + DEBUGA_SKYPE("skype_call now is DOWN\n", SKYPIAX_P_LOG); + p->skype_call_id[0] = '\0'; + + if (p->interface_state != AST_STATE_HANGUP_REQUESTED) { + if (option_debug > 100) { + DEBUGA_PBX("EXITING FUNC\n", SKYPIAX_P_LOG); + } + p->interface_state = AST_STATE_DOWN; + //FIXME if(p->owner) + //FIXME p->owner->hangupcause = AST_CAUSE_NORMAL; + return CALLFLOW_INCOMING_HANGUP; + } else { + p->interface_state = AST_STATE_DOWN; + } + } + + strncpy(messaggio_2, messaggio, sizeof(messaggio) - 1); + + buf = messaggio; + stringp = &buf; + where = strsep(stringp, " "); + if (!where) { + WARNINGA("Skype MSG without spaces: %s\n", SKYPIAX_P_LOG, messaggio); + } + + if (!strcasecmp(messaggio, "#333")) { + /* DEBUGA_SKYPE("Skype MSG: messaggio_2: %s, messaggio2[11]: %s\n", SKYPIAX_P_LOG, + * messaggio_2, &messaggio_2[11]); */ + memset(p->skype_friends, 0, 4096); + strncpy(p->skype_friends, &messaggio_2[11], 4095); + } + if (!strcasecmp(messaggio, "#222")) { + /* DEBUGA_SKYPE("Skype MSG: messaggio_2: %s, messaggio2[10]: %s\n", SKYPIAX_P_LOG, + * messaggio_2, &messaggio_2[10]); */ + memset(p->skype_fullname, 0, 512); + strncpy(p->skype_fullname, &messaggio_2[10], 511); + } + if (!strcasecmp(messaggio, "#765")) { + /* DEBUGA_SKYPE("Skype MSG: messaggio_2: %s, messaggio2[10]: %s\n", SKYPIAX_P_LOG, + * messaggio_2, &messaggio_2[10]); */ + memset(p->skype_displayname, 0, 512); + strncpy(p->skype_displayname, &messaggio_2[10], 511); + } + if (!strcasecmp(messaggio, "ERROR")) { + ERRORA + ("Skype got ERROR: |||%s|||\n", + SKYPIAX_P_LOG, messaggio); + p->skype_callflow = CALLFLOW_STATUS_FINISHED; + if (option_debug) + DEBUGA_SKYPE("skype_call now is DOWN\n", SKYPIAX_P_LOG); + p->skype_call_id[0] = '\0'; + + if (p->interface_state != AST_STATE_HANGUP_REQUESTED) { + if (option_debug > 100) { + DEBUGA_PBX("EXITING FUNC\n", SKYPIAX_P_LOG); + } + p->interface_state = AST_STATE_DOWN; + //FIXME if(p->owner){ + //FIXME p->owner->hangupcause = AST_CAUSE_NORMAL; + //FIXME } + return CALLFLOW_INCOMING_HANGUP; + } else { + p->interface_state = AST_STATE_DOWN; + } + } + if (!strcasecmp(messaggio, "CALL")) { + + strncpy(obj, where, sizeof(obj) - 1); + + where = strsep(stringp, " "); + + strncpy(id, where, sizeof(id) - 1); + + where = strsep(stringp, " "); + + strncpy(prop, where, sizeof(prop) - 1); + + where = strsep(stringp, " "); + + strncpy(value, where, sizeof(value) - 1); + + where = strsep(stringp, " "); + + if (option_debug > 1) + DEBUGA_SKYPE + ("Skype MSG: messaggio: %s, obj: %s, id: %s, prop: %s, value: %s,where: %s!\n", + SKYPIAX_P_LOG, messaggio, obj, id, prop, value, where ? where : "NULL"); + + if (!strcasecmp(prop, "PARTNER_HANDLE")) { + strncpy(p->callid_number, value, sizeof(p->callid_number) - 1); + return CALLFLOW_INCOMING_RING; + } + if (!strcasecmp(prop, "PARTNER_DISPNAME")) { + snprintf(p->callid_name, sizeof(p->callid_name) - 1, "%s%s%s", value, + where ? " " : "", where ? where : ""); + } + if (!strcasecmp(prop, "CONF_ID") && !strcasecmp(value, "0")) { + DEBUGA_SKYPE("the skype_call %s is NOT a conference call\n", SKYPIAX_P_LOG, + id); + if (p->interface_state == AST_STATE_DOWN) + p->interface_state = AST_STATE_PRERING; + } + if (!strcasecmp(prop, "CONF_ID") && strcasecmp(value, "0")) { + DEBUGA_SKYPE("the skype_call %s is a conference call\n", SKYPIAX_P_LOG, id); + if (p->interface_state == AST_STATE_DOWN) + p->interface_state = AST_STATE_PRERING; + } + + if (!strcasecmp(prop, "DTMF")) { + //FIXME struct ast_frame f2 = { AST_FRAME_DTMF, value[0], }; + DEBUGA_SKYPE("Call %s received a DTMF: %s\n", SKYPIAX_P_LOG, id, value); + //FIXME ast_queue_frame(p->owner, &f2); + } + + if (!strcasecmp(prop, "FAILUREREASON")) { + /* if (option_debug > 1) */ + DEBUGA_SKYPE + ("Skype has FAILED on skype_call %s. Let's wait for the FAILED message.\n", + SKYPIAX_P_LOG, id); + } + if (!strcasecmp(prop, "DURATION") && (!strcasecmp(value, "1"))) { + if (strcasecmp(id, p->skype_call_id)) { + strncpy(p->skype_call_id, id, sizeof(p->skype_call_id) - 1); + if (option_debug > 1) + DEBUGA_SKYPE + ("We called a Skype contact and he answered us on skype_call: %s.\n", + SKYPIAX_P_LOG, id); + } + } + + + if (!strcasecmp(prop, "STATUS")) { + + if (!strcasecmp(value, "RINGING")) { + char msg_to_skype[1024]; + if (p->interface_state != AST_STATE_DIALING) { + /* we are not calling out */ + + //FIXME if (!p->owner) + if (1) { + /* we are not inside an active call */ + p->skype_callflow = CALLFLOW_STATUS_RINGING; + p->interface_state = AST_STATE_RING; + /* no owner, no active call, let's answer */ + skypiax_skype_write(p, "SET AGC OFF"); + usleep(10000); + skypiax_skype_write(p, "SET AEC OFF"); + usleep(10000); + sprintf(msg_to_skype, "GET CALL %s PARTNER_DISPNAME", id); + skypiax_skype_write(p, msg_to_skype); + usleep(10000); + sprintf(msg_to_skype, "GET CALL %s PARTNER_HANDLE", id); + skypiax_skype_write(p, msg_to_skype); + usleep(10000); + sprintf(msg_to_skype, "ALTER CALL %s ANSWER", id); + skypiax_skype_write(p, msg_to_skype); + if (option_debug) + DEBUGA_SKYPE("We answered a Skype RING on skype_call %s\n", + SKYPIAX_P_LOG, id); + strncpy(p->skype_call_id, id, sizeof(p->skype_call_id) - 1); + } else { + /* we're owned, we're in a call, let's refuse */ + sprintf(msg_to_skype, "SET CALL %s STATUS FINISHED", id); + skypiax_skype_write(p, msg_to_skype); + usleep(10000); + DEBUGA_SKYPE + ("We have NOT answered a Skype RING on skype_call %s, because we are already in a skypiax call\n", + SKYPIAX_P_LOG, id); + + } + } else { + /* we are calling out */ + p->skype_callflow = CALLFLOW_STATUS_RINGING; + p->interface_state = AST_STATE_RINGING; + //FIXME ast_queue_control(p->owner, AST_CONTROL_RINGING); + strncpy(p->skype_call_id, id, sizeof(p->skype_call_id) - 1); + DEBUGA_SKYPE("Our remote party in skype_call %s is RINGING\n", + SKYPIAX_P_LOG, id); + } + } else if (!strcasecmp(value, "EARLYMEDIA")) { + p->skype_callflow = CALLFLOW_STATUS_EARLYMEDIA; + p->interface_state = AST_STATE_DIALING; + //FIXME ast_queue_control(p->owner, AST_CONTROL_RINGING); + DEBUGA_SKYPE("Our remote party in skype_call %s is EARLYMEDIA\n", + SKYPIAX_P_LOG, id); + } else if (!strcasecmp(value, "MISSED")) { + DEBUGA_SKYPE("We missed skype_call %s\n", SKYPIAX_P_LOG, id); + + } else if (!strcasecmp(value, "FINISHED")) { + p->skype_callflow = CALLFLOW_STATUS_FINISHED; + if (option_debug) + DEBUGA_SKYPE("skype_call %s now is DOWN\n", SKYPIAX_P_LOG, id); + p->skype_call_id[0] = '\0'; + + if (p->interface_state != AST_STATE_HANGUP_REQUESTED) { + if (option_debug > 100) { + DEBUGA_PBX("EXITING FUNC\n", SKYPIAX_P_LOG); + } + p->interface_state = AST_STATE_DOWN; + //FIXME if(p->owner) + //FIXME p->owner->hangupcause = AST_CAUSE_NORMAL; + return CALLFLOW_INCOMING_HANGUP; + } else { + p->interface_state = AST_STATE_DOWN; + } + + } else if (!strcasecmp(value, "CANCELLED")) { + p->skype_callflow = CALLFLOW_STATUS_CANCELLED; + if (option_debug) + DEBUGA_SKYPE + ("we tried to call Skype on skype_call %s and Skype has now CANCELLED\n", + SKYPIAX_P_LOG, id); + p->skype_call_id[0] = '\0'; + + if (p->interface_state != AST_STATE_HANGUP_REQUESTED) { + if (option_debug > 100) { + DEBUGA_PBX("EXITING FUNC\n", SKYPIAX_P_LOG); + } + p->interface_state = AST_STATE_DOWN; + //FIXME if(p->owner) + //FIXME p->owner->hangupcause = AST_CAUSE_NORMAL; + return CALLFLOW_INCOMING_HANGUP; + } else { + p->interface_state = AST_STATE_DOWN; + } + } else if (!strcasecmp(value, "FAILED")) { + p->skype_callflow = CALLFLOW_STATUS_FAILED; + if (option_debug) + DEBUGA_SKYPE + ("we tried to call Skype on skype_call %s and Skype has now FAILED\n", + SKYPIAX_P_LOG, id); + p->skype_call_id[0] = '\0'; + strncpy(p->skype_call_id, id, sizeof(p->skype_call_id) - 1); + p->interface_state = AST_STATE_DOWN; + if (option_debug > 100) { + DEBUGA_PBX("EXITING FUNC\n", SKYPIAX_P_LOG); + } + //FIXME if(p->owner) + //FIXME p->owner->hangupcause = AST_CAUSE_NORMAL; + return CALLFLOW_INCOMING_HANGUP; + } else if (!strcasecmp(value, "REFUSED")) { + if (!strcasecmp(id, p->skype_call_id)) { + /* this is the id of the call we are in, probably we generated it */ + p->skype_callflow = CALLFLOW_STATUS_REFUSED; + if (option_debug) + DEBUGA_SKYPE + ("we tried to call Skype on skype_call %s and Skype has now REFUSED\n", + SKYPIAX_P_LOG, id); + strncpy(p->skype_call_id, id, sizeof(p->skype_call_id) - 1); + p->interface_state = AST_STATE_DOWN; + p->skype_call_id[0] = '\0'; + if (option_debug > 100) { + DEBUGA_PBX("EXITING FUNC\n", SKYPIAX_P_LOG); + } + //FIXME if(p->owner) + //FIXME p->owner->hangupcause = AST_CAUSE_NORMAL; + return CALLFLOW_INCOMING_HANGUP; + } else { + /* we're here because were us that refused an incoming call */ + DEBUGA_SKYPE("we REFUSED skype_call %s\n", SKYPIAX_P_LOG, id); + + } + } else if (!strcasecmp(value, "ROUTING")) { + p->skype_callflow = CALLFLOW_STATUS_ROUTING; + p->interface_state = AST_STATE_DIALING; + strncpy(p->skype_call_id, id, sizeof(p->skype_call_id) - 1); + DEBUGA_SKYPE("skype_call: %s is now ROUTING\n", SKYPIAX_P_LOG, id); + } else if (!strcasecmp(value, "UNPLACED")) { + p->skype_callflow = CALLFLOW_STATUS_UNPLACED; + p->interface_state = AST_STATE_DIALING; + strncpy(p->skype_call_id, id, sizeof(p->skype_call_id) - 1); + DEBUGA_SKYPE("skype_call: %s is now UNPLACED\n", SKYPIAX_P_LOG, id); + } else if (!strcasecmp(value, "INPROGRESS")) { + p->skype_callflow = CALLFLOW_STATUS_INPROGRESS; + strncpy(p->skype_call_id, id, sizeof(p->skype_call_id) - 1); + p->interface_state = AST_STATE_UP; + if (option_debug > 1) + DEBUGA_SKYPE("skype_call: %s is now active\n", SKYPIAX_P_LOG, id); + + //FIXME if (p->owner) { + //FIXME ast_queue_control(p->owner, AST_CONTROL_ANSWER); + //FIXME } + if (option_debug > 1) + DEBUGA_SKYPE("skype_call: %s AST_CONTROL_ANSWER sent\n", SKYPIAX_P_LOG, + id); + + //FIXME if (p->owner) + if (1) { + char msg_to_skype[1024]; + if (!p->tcp_cli_thread) { +#ifdef NOTDEF + if (ast_pthread_create + (&p->tcp_cli_thread, NULL, skypiax_do_tcp_cli_thread, p) < 0) { + ERRORA("Unable to start tcp_cli_thread thread.\n", SKYPIAX_P_LOG); + if (option_debug > 100) { + DEBUGA_PBX("EXITING FUNC\n", SKYPIAX_P_LOG); + } + return -1; + } else { + DEBUGA_SKYPE("started tcp_cli_thread thread.\n", SKYPIAX_P_LOG); + } +#endif //NOTDEF + } + + usleep(100000); + sprintf(msg_to_skype, "ALTER CALL %s SET_OUTPUT PORT=\"5556\"", id); + skypiax_skype_write(p, msg_to_skype); + usleep(100000); + sprintf(msg_to_skype, "ALTER CALL %s SET_INPUT PORT=\"5558\"", id); + skypiax_skype_write(p, msg_to_skype); + usleep(100000); + } + + p->skype_callflow = AST_STATE_UP; + } else { + WARNINGA("skype_call: %s, STATUS: %s is not recognized\n", SKYPIAX_P_LOG, + id, value); + + } + } //STATUS + + } //CALL + + a = 0; + } //message end + } //read_from_pipe + + } + + if (option_debug > 100) { + DEBUGA_PBX("EXITING FUNC\n", SKYPIAX_P_LOG); + } + return 0; +} + +/*! + * \brief This thread runs during a call, and monitor the interface serial port for signaling, like hangup, caller id, etc + * + */ +static void *SWITCH_THREAD_FUNC skypiax_do_controldev_thread(switch_thread_t *thread, void *obj) +//void *skypiax_do_controldev_thread(void *data) +{ + struct skypiax_config *p = obj; + int res; + + DEBUGA_PBX("ENTERING FUNC\n", SKYPIAX_P_LOG); + + DEBUGA_SKYPE("In skypiax_do_controldev_thread: started, p=%p\n", SKYPIAX_P_LOG, (void *)p); + + + while (1) { + usleep(1000); + res = skypiax_skype_read(p); +#if 0 + if (res == CALLFLOW_INCOMING_HANGUP) { + //if (option_debug) + DEBUGA_SKYPE("skype call ended\n", SKYPIAX_P_LOG); + if (p->owner) { + pthread_testcancel(); + ast_queue_control(p->owner, AST_CONTROL_HANGUP); + } + } +#endif + } + + //if (option_debug > 10) { + DEBUGA_PBX("EXITING FUNC\n", SKYPIAX_P_LOG); + //} + return NULL; + +} + + +#endif // CONTROLDEV_THREAD static switch_status_t load_config(void) { @@ -1280,6 +1835,19 @@ switch_thread_create(&thread, thd_attr, do_skype_thread, &SKYPIAX_CONFIGS[span_id], module_pool); } +usleep(100000); +if(1) +{ + switch_thread_t *thread; + switch_threadattr_t *thd_attr = NULL; + + switch_threadattr_create(&thd_attr, module_pool); + switch_threadattr_detach_set(thd_attr, 1); + switch_threadattr_stacksize_set(thd_attr, SWITCH_THREAD_STACKSIZE); + switch_thread_create(&thread, thd_attr, skypiax_do_controldev_thread, &SKYPIAX_CONFIGS[span_id], module_pool); +} + + usleep(1000000); skypiax_skypeaudio_init(&SKYPIAX_CONFIGS[span_id]);