X-Git-Url: http://git.eversberg.eu/gitweb.cgi?p=lcr.git;a=blobdiff_plain;f=joinpbx.cpp;h=988ba24280933fbbeb17277b19d432f617b7d8e0;hp=d3640b16ec0cd3fcb2a6588dd13eeef56d5cc711;hb=a698197188e22f42a5483bcb775f66522863d871;hpb=1da71caff97a56350c994bc7b4ecdd523b1a8e60 diff --git a/joinpbx.cpp b/joinpbx.cpp index d3640b1..988ba24 100644 --- a/joinpbx.cpp +++ b/joinpbx.cpp @@ -202,6 +202,7 @@ void joinpbx_debug(class JoinPBX *joinpbx, const char *function) PDEBUG(DEBUG_JOIN, "end\n"); } +int update_bridge(struct lcr_work *work, void *instance, int index); /* * constructor for a new join @@ -223,11 +224,12 @@ JoinPBX::JoinPBX(class Endpoint *epoint) : Join() j_dialed[0] = '\0'; j_todial[0] = '\0'; j_pid = getpid(); - j_updatebridge = 0; j_partyline = 0; j_partyline_jingle = 0; j_multicause = 0; j_multilocation = 0; + memset(&j_updatebridge, 0, sizeof(j_updatebridge)); + add_work(&j_updatebridge, update_bridge, this, 0); /* initialize a relation only to the calling interface */ relation = j_relation = (struct join_relation *)MALLOC(sizeof(struct join_relation)); @@ -258,12 +260,23 @@ JoinPBX::~JoinPBX() cmemuse--; relation = rtemp; } + + del_work(&j_updatebridge); } /* bridge sets the audio flow of all bchannels assiociated to 'this' join * also it changes and notifies active/hold/conference states */ +int update_bridge(struct lcr_work *work, void *instance, int index) +{ + class JoinPBX *joinpbx = (class JoinPBX *)instance; + + joinpbx->bridge(); + + return 0; +} + void JoinPBX::bridge(void) { struct join_relation *relation; @@ -354,15 +367,13 @@ void JoinPBX::bridge(void) } /* - * request data from endpoint/port if: - * - two relations - * - any without mISDN - * in this case we bridge + * Bridge between port instances if: + * - two or more relations + * - one or all are not mISDN */ - message = message_create(j_serial, relation->epoint_id, JOIN_TO_EPOINT, MESSAGE_mISDNSIGNAL); - message->param.mISDNsignal.message = mISDNSIGNAL_JOINDATA; - message->param.mISDNsignal.joindata = (relations==2 && !allmISDN); - PDEBUG(DEBUG_JOIN, "join%d EP%d set joindata=%d\n", j_serial, relation->epoint_id, message->param.mISDNsignal.joindata); + message = message_create(j_serial, relation->epoint_id, JOIN_TO_EPOINT, MESSAGE_BRIDGE); + message->param.bridge_id = (relations>=2 && !allmISDN) ? j_serial : 0; + PDEBUG(DEBUG_JOIN, "join%u EP%u requests bridge=%u\n", j_serial, relation->epoint_id, message->param.bridge_id); message_put(message); relation = relation->next; @@ -400,43 +411,6 @@ void JoinPBX::bridge(void) } } -/* - * bridging is only possible with two connected endpoints - */ -void JoinPBX::bridge_data(unsigned int epoint_from, struct join_relation *relation_from, union parameter *param) -{ - struct join_relation *relation_to; - - /* if we are alone */ - if (!j_relation->next) - return; - - /* if we are more than two */ - if (j_relation->next->next) - return; - - /* skip if source endpoint has NOT audio mode CONNECT */ - if (relation_from->channel_state != 1) - return; - - /* get destination relation */ - relation_to = j_relation; - if (relation_to == relation_from) { - /* oops, we are the first, so destination is: */ - relation_to = relation_to->next; - } - - /* skip if destination endpoint has NOT audio mode CONNECT */ - if (relation_to->channel_state != 1) - return; - - /* now we may send our data to the endpoint where it - * will be delivered to the port - */ -//printf("from %d, to %d\n", relation_from->epoint_id, relation_to->epoint_id); - message_forward(j_serial, relation_to->epoint_id, JOIN_TO_EPOINT, param); -} - /* release join from endpoint * if the join has two relations, all relations are freed and the join will be * destroyed @@ -453,7 +427,7 @@ int JoinPBX::release(struct join_relation *relation, int location, int cause) /* remove from bridge */ if (relation->channel_state != 0) { relation->channel_state = 0; - j_updatebridge = 1; /* update bridge flag */ + trigger_work(&j_updatebridge); // note: if join is not released, bridge must be updated } @@ -525,9 +499,6 @@ int joinpbx_countrelations(unsigned int join_id) if (!join) return(0); - if (join->j_type == JOIN_TYPE_REMOTE) - return(2); - if (join->j_type != JOIN_TYPE_PBX) return(0); joinpbx = (class JoinPBX *)join; @@ -638,7 +609,7 @@ void JoinPBX::message_epoint(unsigned int epoint_id, int message_type, union par // joinpbx_debug(join,"Join::message_epoint"); // } if (options.deb & DEBUG_JOIN) { - if (message_type != MESSAGE_DATA) { + if (message_type) { cl = join_first; while(cl) { if (cl->j_type == JOIN_TYPE_PBX) @@ -677,7 +648,7 @@ void JoinPBX::message_epoint(unsigned int epoint_id, int message_type, union par SPRINT(message->param.connectinfo.id, "%d", j_partyline); message->param.connectinfo.ntype = INFO_NTYPE_UNKNOWN; message_put(message); - j_updatebridge = 1; /* update bridge flag */ + trigger_work(&j_updatebridge); if (j_partyline_jingle) play_jingle(1); break; @@ -686,7 +657,7 @@ void JoinPBX::message_epoint(unsigned int epoint_id, int message_type, union par PDEBUG(DEBUG_JOIN, "join received channel message: %d.\n", param->audiopath); if (relation->channel_state != param->audiopath) { relation->channel_state = param->audiopath; - j_updatebridge = 1; /* update bridge flag */ + trigger_work(&j_updatebridge); if (options.deb & DEBUG_JOIN) joinpbx_debug(this, "Join::message_epoint{after setting new channel state}"); } @@ -718,10 +689,10 @@ void JoinPBX::message_epoint(unsigned int epoint_id, int message_type, union par switch(message_type) { /* process audio path message */ case MESSAGE_AUDIOPATH: - PDEBUG(DEBUG_JOIN, "join received channel message: %d.\n", param->audiopath); + PDEBUG(DEBUG_JOIN, "join received channel message: audiopath=%d, current relation's channel_state=%d\n", param->audiopath, relation->channel_state); if (relation->channel_state != param->audiopath) { relation->channel_state = param->audiopath; - j_updatebridge = 1; /* update bridge flag */ + trigger_work(&j_updatebridge); if (options.deb & DEBUG_JOIN) joinpbx_debug(this, "Join::message_epoint{after setting new channel state}"); } @@ -739,7 +710,7 @@ void JoinPBX::message_epoint(unsigned int epoint_id, int message_type, union par new_state = track_notify(relation->rx_state, param->notifyinfo.notify); if (new_state != relation->rx_state) { relation->rx_state = new_state; - j_updatebridge = 1; + trigger_work(&j_updatebridge); if (options.deb & DEBUG_JOIN) joinpbx_debug(this, "Join::message_epoint{after setting new rx state}"); } @@ -759,12 +730,6 @@ void JoinPBX::message_epoint(unsigned int epoint_id, int message_type, union par } return; - /* audio data */ - case MESSAGE_DATA: - /* now send audio data to the other endpoint */ - bridge_data(epoint_id, relation, param); - return; - /* relations sends a connect */ case MESSAGE_CONNECT: /* outgoing setup type becomes connected */ @@ -895,30 +860,6 @@ void JoinPBX::message_epoint(unsigned int epoint_id, int message_type, union par } -/* join process is called from the main loop - * it processes the current calling state. - * returns 0 if join nothing was done - */ -int JoinPBX::handler(void) -{ -// struct join_relation *relation; -// char dialing[32][32]; -// int port[32]; -// int found; -// int i, j; -// char *p; - - /* the bridge must be updated */ - if (j_updatebridge) { - bridge(); - j_updatebridge = 0; - return(1); - } - - return(0); -} - - int track_notify(int oldstate, int notify) { int newstate = oldstate; @@ -974,8 +915,7 @@ int JoinPBX::out_setup(unsigned int epoint_id, int message_type, union parameter epoint = new Endpoint(0, j_serial); if (!epoint) FATAL("No memory for Endpoint instance\n"); - if (!(epoint->ep_app = new DEFAULT_ENDPOINT_APP(epoint, 1))) // outgoing - FATAL("No memory for Endpoint Application instance\n"); + epoint->ep_app = new_endpointapp(epoint, 1, EAPP_TYPE_PBX); // outgoing relation->epoint_id = epoint->ep_serial; /* send setup message to new endpoint */ //printf("JOLLY DEBUG: %d\n",join_countrelations(j_serial));