}
/*
- * request data from endpoint/port if:
+ * Bridge between port instances if:
* - two relations
- * - any without mISDN
- * in this case we bridge
+ * - 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;
}
}
-/*
- * 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
// 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)
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;
trigger_work(&j_updatebridge);
}
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 */
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));