17 #include "ooh323cDriver.h"
25 #undef AST_BACKGROUND_STACKSIZE
26 #define AST_BACKGROUND_STACKSIZE 768 * 1024
28 #define SEC_TO_HOLD_THREAD 24
31 extern OOBOOL gH323Debug;
32 extern OOH323EndPoint gH323ep;
34 static pthread_t ooh323c_thread = AST_PTHREADT_NULL;
35 static pthread_t ooh323cmd_thread = AST_PTHREADT_NULL;
36 static int grxframes = 240;
38 static int gtxframes = 20;
46 } *callThreads = NULL;
48 AST_MUTEX_DEFINE_STATIC(callThreadsLock);
51 int ooh323c_start_receive_channel(ooCallData *call, ooLogicalChannel *pChannel);
52 int ooh323c_start_transmit_channel(ooCallData *call, ooLogicalChannel *pChannel);
53 int ooh323c_stop_receive_channel(ooCallData *call, ooLogicalChannel *pChannel);
54 int ooh323c_stop_transmit_channel(ooCallData *call, ooLogicalChannel *pChannel);
56 int ooh323c_start_receive_datachannel(ooCallData *call, ooLogicalChannel *pChannel);
57 int ooh323c_start_transmit_datachannel(ooCallData *call, ooLogicalChannel *pChannel);
58 int ooh323c_stop_receive_datachannel(ooCallData *call, ooLogicalChannel *pChannel);
59 int ooh323c_stop_transmit_datachannel(ooCallData *call, ooLogicalChannel *pChannel);
61 void* ooh323c_stack_thread(
void* dummy);
62 void* ooh323c_cmd_thread(
void* dummy);
63 void* ooh323c_call_thread(
void* dummy);
64 int ooh323c_set_aliases(ooAliases * aliases);
66 void* ooh323c_stack_thread(
void* dummy)
73 void* ooh323c_cmd_thread(
void* dummy)
76 ooMonitorCmdChannels();
80 void* ooh323c_call_thread(
void* dummy)
83 struct pollfd pfds[1];
89 ooMonitorCallChannels((ooCallData*)mycthread->call);
90 mycthread->call = NULL;
91 mycthread->prev = NULL;
92 mycthread->inUse = FALSE;
94 ast_mutex_lock(&callThreadsLock);
95 mycthread->next = callThreads;
96 callThreads = mycthread;
97 if (mycthread->next) mycthread->next->prev = mycthread;
98 ast_mutex_unlock(&callThreadsLock);
100 pfds[0].fd = mycthread->thePipe[0];
101 pfds[0].events = POLLIN;
102 ooSocketPoll(pfds, 1, SEC_TO_HOLD_THREAD * 1000);
103 if (ooPDRead(pfds, 1, mycthread->thePipe[0]))
104 res = read(mycthread->thePipe[0], &c, 1);
106 ast_mutex_lock(&callThreadsLock);
107 ast_mutex_lock(&mycthread->lock);
109 mycthread->prev->next = mycthread->next;
111 callThreads = mycthread->next;
113 mycthread->next->prev = mycthread->prev;
114 ast_mutex_unlock(&mycthread->lock);
115 ast_mutex_unlock(&callThreadsLock);
117 }
while (mycthread->call != NULL && res >= 0);
120 ast_mutex_destroy(&mycthread->lock);
122 close(mycthread->thePipe[0]);
123 close(mycthread->thePipe[1]);
130 int ooh323c_start_call_thread(ooCallData *call) {
134 ast_mutex_lock(&callThreadsLock);
135 while (cur != NULL && (cur->inUse || ast_mutex_trylock(&cur->lock))) {
138 ast_mutex_unlock(&callThreadsLock);
141 if (cur->inUse || write(cur->thePipe[1], &c, 1) < 0) {
142 ast_mutex_unlock(&cur->lock);
150 ast_log(LOG_ERROR,
"Unable to allocate thread structure for call %s\n",
156 if ((socketpair(PF_LOCAL, SOCK_STREAM, 0, cur->thePipe)) == -1) {
157 ast_log(LOG_ERROR,
"Can't create thread pipe for call %s\n", call->callToken);
164 ast_mutex_init(&cur->lock);
167 ast_debug(1,
"new call thread created for call %s\n", call->callToken);
169 if(ast_pthread_create_detached_background(&call->callThread, NULL, ooh323c_call_thread, cur) < 0)
171 ast_log(LOG_ERROR,
"Unable to start ooh323c call thread for call %s\n",
173 ast_mutex_destroy(&cur->lock);
174 close(cur->thePipe[0]);
175 close(cur->thePipe[1]);
182 ast_debug(1,
"using existing call thread for call %s\n", call->callToken);
185 ast_mutex_unlock(&cur->lock);
192 int ooh323c_stop_call_thread(ooCallData *call) {
193 if (call->callThread != AST_PTHREADT_NULL) {
194 ooStopMonitorCallChannels(call);
199 int ooh323c_start_stack_thread()
201 if(ast_pthread_create_background(&ooh323c_thread, NULL, ooh323c_stack_thread, NULL) < 0)
203 ast_log(LOG_ERROR,
"Unable to start ooh323c thread.\n");
206 if(ast_pthread_create_background(&ooh323cmd_thread, NULL, ooh323c_cmd_thread, NULL) < 0)
208 ast_log(LOG_ERROR,
"Unable to start ooh323cmd thread.\n");
214 int ooh323c_stop_stack_thread(
void)
216 if(ooh323c_thread != AST_PTHREADT_NULL)
219 pthread_join(ooh323c_thread, NULL);
220 ooh323c_thread = AST_PTHREADT_NULL;
221 pthread_join(ooh323cmd_thread, NULL);
222 ooh323cmd_thread = AST_PTHREADT_NULL;
227 int ooh323c_set_capability
232 ast_verb(0,
"\tAdding capabilities to H323 endpoint\n");
241 ast_verb(0,
"\tAdding g711 ulaw capability to H323 endpoint\n");
243 ret= ooH323EpAddG711Capability(OO_G711ULAW64K, gtxframes, grxframes,
244 OORXANDTX, &ooh323c_start_receive_channel,
245 &ooh323c_start_transmit_channel,
246 &ooh323c_stop_receive_channel,
247 &ooh323c_stop_transmit_channel);
252 ast_verb(0,
"\tAdding g711 alaw capability to H323 endpoint\n");
254 ret= ooH323EpAddG711Capability(OO_G711ALAW64K, gtxframes, grxframes,
255 OORXANDTX, &ooh323c_start_receive_channel,
256 &ooh323c_start_transmit_channel,
257 &ooh323c_stop_receive_channel,
258 &ooh323c_stop_transmit_channel);
264 ast_verb(0,
"\tAdding g729A capability to H323 endpoint\n");
266 ret = ooH323EpAddG729Capability(OO_G729A, 2, 24,
267 OORXANDTX, &ooh323c_start_receive_channel,
268 &ooh323c_start_transmit_channel,
269 &ooh323c_stop_receive_channel,
270 &ooh323c_stop_transmit_channel);
273 ast_verb(0,
"\tAdding g729 capability to H323 endpoint\n");
275 ret |= ooH323EpAddG729Capability(OO_G729, 2, 24,
276 OORXANDTX, &ooh323c_start_receive_channel,
277 &ooh323c_start_transmit_channel,
278 &ooh323c_stop_receive_channel,
279 &ooh323c_stop_transmit_channel);
281 ast_verb(0,
"\tAdding g729b capability to H323 endpoint\n");
283 ret |= ooH323EpAddG729Capability(OO_G729B, 2, 24,
284 OORXANDTX, &ooh323c_start_receive_channel,
285 &ooh323c_start_transmit_channel,
286 &ooh323c_stop_receive_channel,
287 &ooh323c_stop_transmit_channel);
293 ast_verb(0,
"\tAdding g7231 capability to H323 endpoint\n");
295 ret = ooH323EpAddG7231Capability(OO_G7231, 1, 1, FALSE,
296 OORXANDTX, &ooh323c_start_receive_channel,
297 &ooh323c_start_transmit_channel,
298 &ooh323c_stop_receive_channel,
299 &ooh323c_stop_transmit_channel);
306 ast_verb(0,
"\tAdding g726 capability to H323 endpoint\n");
308 ret = ooH323EpAddG726Capability(OO_G726, gtxframes, grxframes, FALSE,
309 OORXANDTX, &ooh323c_start_receive_channel,
310 &ooh323c_start_transmit_channel,
311 &ooh323c_stop_receive_channel,
312 &ooh323c_stop_transmit_channel);
319 ast_verb(0,
"\tAdding g726aal2 capability to H323 endpoint\n");
321 ret = ooH323EpAddG726Capability(OO_G726AAL2, gtxframes, grxframes, FALSE,
322 OORXANDTX, &ooh323c_start_receive_channel,
323 &ooh323c_start_transmit_channel,
324 &ooh323c_stop_receive_channel,
325 &ooh323c_stop_transmit_channel);
332 ast_verb(0,
"\tAdding h263 capability to H323 endpoint\n");
334 ret = ooH323EpAddH263VideoCapability(OO_H263VIDEO, 1, 0, 0, 0, 0, 320*1024,
335 OORXANDTX, &ooh323c_start_receive_channel,
336 &ooh323c_start_transmit_channel,
337 &ooh323c_stop_receive_channel,
338 &ooh323c_stop_transmit_channel);
345 ast_verb(0,
"\tAdding gsm capability to H323 endpoint\n");
347 ret = ooH323EpAddGSMCapability(OO_GSMFULLRATE, 4, FALSE, FALSE,
348 OORXANDTX, &ooh323c_start_receive_channel,
349 &ooh323c_start_transmit_channel,
350 &ooh323c_stop_receive_channel,
351 &ooh323c_stop_transmit_channel);
358 ast_verb(0,
"\tAdding speex capability to H323 endpoint\n");
360 ret = ooH323EpAddSpeexCapability(OO_SPEEX, 4, 4, FALSE,
361 OORXANDTX, &ooh323c_start_receive_channel,
362 &ooh323c_start_transmit_channel,
363 &ooh323c_stop_receive_channel,
364 &ooh323c_stop_transmit_channel);
371 if(dtmf & H323_DTMF_CISCO)
372 ret |= ooH323EpEnableDTMFCISCO(0);
373 if(dtmf & H323_DTMF_RFC2833)
374 ret |= ooH323EpEnableDTMFRFC2833(0);
375 else if(dtmf & H323_DTMF_H245ALPHANUMERIC)
376 ret |= ooH323EpEnableDTMFH245Alphanumeric();
377 else if(dtmf & H323_DTMF_H245SIGNAL)
378 ret |= ooH323EpEnableDTMFH245Signal();
383 int ooh323c_set_capability_for_call
384 (ooCallData *call,
struct ast_format_cap *cap,
int dtmf,
int dtmfcodec,
385 int t38support,
int g729onlyA)
387 int ret = 0, x, txframes;
389 ast_verb(0,
"\tAdding capabilities to call(%s, %s)\n", call->callType,
392 if(dtmf & H323_DTMF_CISCO || 1)
393 ret |= ooCallEnableDTMFCISCO(call,dtmfcodec);
394 if(dtmf & H323_DTMF_RFC2833 || 1)
395 ret |= ooCallEnableDTMFRFC2833(call,dtmfcodec);
396 if(dtmf & H323_DTMF_H245ALPHANUMERIC || 1)
397 ret |= ooCallEnableDTMFH245Alphanumeric(call);
398 if(dtmf & H323_DTMF_H245SIGNAL || 1)
399 ret |= ooCallEnableDTMFH245Signal(call);
402 ooCapabilityAddT38Capability(call, OO_T38, OORXANDTX,
403 &ooh323c_start_receive_datachannel,
404 &ooh323c_start_transmit_datachannel,
405 &ooh323c_stop_receive_datachannel,
406 &ooh323c_stop_transmit_datachannel,
415 ast_verb(0,
"\tAdding g711 ulaw capability to call(%s, %s)\n",
416 call->callType, call->callToken);
419 ret= ooCallAddG711Capability(call, OO_G711ULAW64K, txframes,
421 &ooh323c_start_receive_channel,
422 &ooh323c_start_transmit_channel,
423 &ooh323c_stop_receive_channel,
424 &ooh323c_stop_transmit_channel);
429 ast_verb(0,
"\tAdding g711 alaw capability to call(%s, %s)\n",
430 call->callType, call->callToken);
433 ret= ooCallAddG711Capability(call, OO_G711ALAW64K, txframes,
435 &ooh323c_start_receive_channel,
436 &ooh323c_start_transmit_channel,
437 &ooh323c_stop_receive_channel,
438 &ooh323c_stop_transmit_channel);
444 ast_verb(0,
"\tAdding g726 capability to call (%s, %s)\n",
445 call->callType, call->callToken);
448 ret = ooCallAddG726Capability(call, OO_G726, txframes, grxframes, FALSE,
449 OORXANDTX, &ooh323c_start_receive_channel,
450 &ooh323c_start_transmit_channel,
451 &ooh323c_stop_receive_channel,
452 &ooh323c_stop_transmit_channel);
459 ast_verb(0,
"\tAdding g726aal2 capability to call (%s, %s)\n",
460 call->callType, call->callToken);
463 ret = ooCallAddG726Capability(call, OO_G726AAL2, txframes, grxframes, FALSE,
464 OORXANDTX, &ooh323c_start_receive_channel,
465 &ooh323c_start_transmit_channel,
466 &ooh323c_stop_receive_channel,
467 &ooh323c_stop_transmit_channel);
476 ast_verb(0,
"\tAdding g729A capability to call(%s, %s)\n",
477 call->callType, call->callToken);
479 ret= ooCallAddG729Capability(call, OO_G729A, txframes, txframes,
480 OORXANDTX, &ooh323c_start_receive_channel,
481 &ooh323c_start_transmit_channel,
482 &ooh323c_stop_receive_channel,
483 &ooh323c_stop_transmit_channel);
487 ast_verb(0,
"\tAdding g729 capability to call(%s, %s)\n",
488 call->callType, call->callToken);
490 ret|= ooCallAddG729Capability(call, OO_G729, txframes, txframes,
491 OORXANDTX, &ooh323c_start_receive_channel,
492 &ooh323c_start_transmit_channel,
493 &ooh323c_stop_receive_channel,
494 &ooh323c_stop_transmit_channel);
496 ast_verb(0,
"\tAdding g729B capability to call(%s, %s)\n",
497 call->callType, call->callToken);
499 ret|= ooCallAddG729Capability(call, OO_G729B, txframes, txframes,
500 OORXANDTX, &ooh323c_start_receive_channel,
501 &ooh323c_start_transmit_channel,
502 &ooh323c_stop_receive_channel,
503 &ooh323c_stop_transmit_channel);
510 ast_verb(0,
"\tAdding g7231 capability to call (%s, %s)\n",
511 call->callType, call->callToken);
513 ret = ooCallAddG7231Capability(call, OO_G7231, 1, 1, FALSE,
514 OORXANDTX, &ooh323c_start_receive_channel,
515 &ooh323c_start_transmit_channel,
516 &ooh323c_stop_receive_channel,
517 &ooh323c_stop_transmit_channel);
524 ast_verb(0,
"\tAdding h263 capability to call (%s, %s)\n",
525 call->callType, call->callToken);
527 ret = ooCallAddH263VideoCapability(call, OO_H263VIDEO, 1, 0, 0, 0, 0, 320*1024,
528 OORXANDTX, &ooh323c_start_receive_channel,
529 &ooh323c_start_transmit_channel,
530 &ooh323c_stop_receive_channel,
531 &ooh323c_stop_transmit_channel);
538 ast_verb(0,
"\tAdding gsm capability to call(%s, %s)\n",
539 call->callType, call->callToken);
541 ret = ooCallAddGSMCapability(call, OO_GSMFULLRATE, 4, FALSE, FALSE,
542 OORXANDTX, &ooh323c_start_receive_channel,
543 &ooh323c_start_transmit_channel,
544 &ooh323c_stop_receive_channel,
545 &ooh323c_stop_transmit_channel);
551 ast_verb(0,
"\tAdding Speex capability to call(%s, %s)\n",
552 call->callType, call->callToken);
554 ret = ooCallAddSpeexCapability(call, OO_SPEEX, 4, 4, FALSE,
555 OORXANDTX, &ooh323c_start_receive_channel,
556 &ooh323c_start_transmit_channel,
557 &ooh323c_stop_receive_channel,
558 &ooh323c_stop_transmit_channel);
566 int ooh323c_set_aliases(ooAliases * aliases)
568 ooAliases *cur = aliases;
573 case T_H225AliasAddress_dialedDigits:
574 ooH323EpAddAliasDialedDigits(cur->value);
576 case T_H225AliasAddress_h323_ID:
577 ooH323EpAddAliasH323ID(cur->value);
579 case T_H225AliasAddress_url_ID:
580 ooH323EpAddAliasURLID(cur->value);
582 case T_H225AliasAddress_email_ID:
583 ooH323EpAddAliasEmailID(cur->value);
586 ast_debug(1,
"Ignoring unknown alias type\n");
593 int ooh323c_start_receive_channel(ooCallData *call, ooLogicalChannel *pChannel)
596 tmpfmt = convertH323CapToAsteriskCap(pChannel->chanCap->cap);
600 ast_log(LOG_ERROR,
"Invalid capability type for receive channel %s\n",
607 int ooh323c_start_transmit_channel(ooCallData *call, ooLogicalChannel *pChannel)
610 tmpfmt = convertH323CapToAsteriskCap(pChannel->chanCap->cap);
615 ooh323_set_write_format(call, tmpfmt, ((OOCapParams *)(pChannel->chanCap->params))->txframes);
617 ooh323_set_write_format(call, tmpfmt, ((OOCapParams *)(pChannel->chanCap->params))->txframes*10);
619 ooh323_set_write_format(call, tmpfmt, 0);
622 ast_log(LOG_ERROR,
"Invalid capability type for receive channel %s\n",
626 setup_rtp_connection(call, pChannel->remoteIP, pChannel->remoteMediaPort);
630 int ooh323c_stop_receive_channel(ooCallData *call, ooLogicalChannel *pChannel)
635 int ooh323c_stop_transmit_channel(ooCallData *call, ooLogicalChannel *pChannel)
637 close_rtp_connection(call);
642 int ooh323c_start_receive_datachannel(ooCallData *call, ooLogicalChannel *pChannel)
647 int ooh323c_start_transmit_datachannel(ooCallData *call, ooLogicalChannel *pChannel)
649 setup_udptl_connection(call, pChannel->remoteIP, pChannel->remoteMediaPort);
653 int ooh323c_stop_receive_datachannel(ooCallData *call, ooLogicalChannel *pChannel)
658 int ooh323c_stop_transmit_datachannel(ooCallData *call, ooLogicalChannel *pChannel)
660 close_udptl_connection(call);
664 struct ast_format *convertH323CapToAsteriskCap(
int cap)
691 ast_debug(1,
"Cap %d is not supported by driver yet\n", cap);
Asterisk locking-related definitions:
Asterisk main include file. File version handling, generic pbx functions.
void ast_update_use_count(void)
Notify when usecount has been changed.
#define ao2_ref(o, delta)
Reference/unreference an object and return the old refcount.
#define ast_debug(level,...)
Log a DEBUG message.
Core PBX routines and definitions.
#define ast_module_ref(mod)
Hold a reference to the module.
#define ast_calloc(num, len)
A wrapper for calloc()
Support for logging to various files, console and syslog Configuration in file logger.conf.
#define ast_module_unref(mod)
Release a reference to the module.
Structure for mutex and tracking information.