just backup. (partyline join/release jingle not tested yet, no sound yet)
This commit is contained in:
parent
704047acd3
commit
db6990e487
|
@ -546,7 +546,7 @@ void EndpointAppPBX::action_init_partyline(void)
|
|||
struct port_list *portlist = ea_endpoint->ep_portlist;
|
||||
struct message *message;
|
||||
struct route_param *rparam;
|
||||
int partyline;
|
||||
int partyline, jingle = 0;
|
||||
struct join_relation *relation;
|
||||
|
||||
portlist = ea_endpoint->ep_portlist;
|
||||
|
@ -571,6 +571,8 @@ void EndpointAppPBX::action_init_partyline(void)
|
|||
goto noroom;
|
||||
}
|
||||
partyline = rparam->integer_value;
|
||||
if ((rparam = routeparam(e_action, PARAM_JINGLE)))
|
||||
jingle = 1;
|
||||
|
||||
/* don't create join if partyline exists */
|
||||
join = join_first;
|
||||
|
@ -579,7 +581,7 @@ void EndpointAppPBX::action_init_partyline(void)
|
|||
if (join->j_type == JOIN_TYPE_PBX)
|
||||
{
|
||||
joinpbx = (class JoinPBX *)join;
|
||||
if (joinpbx->j_partyline == rparam->integer_value)
|
||||
if (joinpbx->j_partyline == partyline)
|
||||
break;
|
||||
}
|
||||
join = join->next;
|
||||
|
@ -614,9 +616,11 @@ void EndpointAppPBX::action_init_partyline(void)
|
|||
/* send setup to join */
|
||||
trace_header("ACTION partyline (calling)", DIRECTION_NONE);
|
||||
add_trace("room", NULL, "%d", partyline);
|
||||
add_trace("jingle", NULL, (jingle)?"on":"off");
|
||||
end_trace();
|
||||
message = message_create(ea_endpoint->ep_serial, ea_endpoint->ep_join_id, EPOINT_TO_JOIN, MESSAGE_SETUP);
|
||||
message->param.setup.partyline = partyline;
|
||||
message->param.setup.partyline_jingle = jingle;
|
||||
memcpy(&message->param.setup.dialinginfo, &e_dialinginfo, sizeof(struct dialing_info));
|
||||
memcpy(&message->param.setup.redirinfo, &e_redirinfo, sizeof(struct redir_info));
|
||||
memcpy(&message->param.setup.callerinfo, &e_callerinfo, sizeof(struct caller_info));
|
||||
|
|
15
apppbx.cpp
15
apppbx.cpp
|
@ -697,11 +697,6 @@ void EndpointAppPBX::set_tone(struct port_list *portlist, char *tone)
|
|||
/* store for suspended processes */
|
||||
SCPY(e_tone, tone);
|
||||
|
||||
if (!portlist)
|
||||
{
|
||||
PDEBUG(DEBUG_EPOINT, "EPOINT(%d) no endpoint to notify tone.\n", ea_endpoint->ep_serial);
|
||||
return;
|
||||
}
|
||||
|
||||
if (e_join_pattern /* pattern are provided */
|
||||
&& !(e_ext.own_setup && e_state == EPOINT_STATE_IN_SETUP)
|
||||
|
@ -727,6 +722,10 @@ void EndpointAppPBX::set_tone(struct port_list *portlist, char *tone)
|
|||
SCPY(message->param.tone.name, tone);
|
||||
message_put(message);
|
||||
logmessage(message->type, &message->param, portlist->port_id, DIRECTION_OUT);
|
||||
} else
|
||||
{
|
||||
PDEBUG(DEBUG_EPOINT, "EPOINT(%d) no port to notify tone.\n", ea_endpoint->ep_serial);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -3495,6 +3494,12 @@ void EndpointAppPBX::ea_message_join(unsigned long join_id, int message_type, un
|
|||
// PDEBUG(DEBUG_EPOINT, "EPOINT(%d) received message %d for active JOIN (terminal %s, caller id %s state=%d)\n", ea_endpoint->ep_serial, message, e_ext.number, e_callerinfo.id, e_state);
|
||||
switch(message_type)
|
||||
{
|
||||
/* JOIN SENDS TONE message */
|
||||
case MESSAGE_TONE:
|
||||
PDEBUG(DEBUG_EPOINT, "EPOINT(%d) epoint with terminal '%s' (caller id '%s') received tone message: '%d'\n", ea_endpoint->ep_serial, e_ext.number, e_callerinfo.id, param->tone.name);
|
||||
set_tone(portlist, param->tone.name);
|
||||
break;
|
||||
|
||||
/* JOIN SENDS CRYPT message */
|
||||
case MESSAGE_CRYPT:
|
||||
PDEBUG(DEBUG_EPOINT, "EPOINT(%d) epoint with terminal '%s' (caller id '%s') received crypt message: '%d'\n", ea_endpoint->ep_serial, e_ext.number, e_callerinfo.id, param->crypt.type);
|
||||
|
|
27
joinpbx.cpp
27
joinpbx.cpp
|
@ -255,6 +255,7 @@ JoinPBX::JoinPBX(class Endpoint *epoint) : Join()
|
|||
j_pid = getpid();
|
||||
j_updatebridge = 0;
|
||||
j_partyline = 0;
|
||||
j_partyline_jingle = 0;
|
||||
j_multicause = 0;
|
||||
j_multilocation = 0;
|
||||
|
||||
|
@ -430,7 +431,7 @@ void JoinPBX::bridge(void)
|
|||
relation = relation->next;
|
||||
}
|
||||
} else
|
||||
/* if conference/partyline or (more than two members and more than one is connected), so we set conference state */
|
||||
/* if conference/partyline (or more than two members and more than one is connected), so we set conference state */
|
||||
{
|
||||
PDEBUG(DEBUG_JOIN, "join%d %d members, %d connected, signal conference\n", relations, numconnect);
|
||||
relation = j_relation;
|
||||
|
@ -699,9 +700,10 @@ void JoinPBX::message_epoint(unsigned long epoint_id, int message_type, union pa
|
|||
}
|
||||
|
||||
/* process party line */
|
||||
if (message_type == MESSAGE_SETUP) if (param->setup.partyline)
|
||||
if (message_type == MESSAGE_SETUP) if (param->setup.partyline && !j_partyline)
|
||||
{
|
||||
j_partyline = param->setup.partyline;
|
||||
j_partyline_jingle = param->setup.partyline_jingle;
|
||||
}
|
||||
if (j_partyline)
|
||||
{
|
||||
|
@ -715,6 +717,8 @@ void JoinPBX::message_epoint(unsigned long epoint_id, int message_type, union pa
|
|||
message->param.connectinfo.ntype = INFO_NTYPE_UNKNOWN;
|
||||
message_put(message);
|
||||
j_updatebridge = 1; /* update bridge flag */
|
||||
if (j_relation->next && j_partyline_jingle)
|
||||
play_jingle(1);
|
||||
break;
|
||||
|
||||
case MESSAGE_AUDIOPATH:
|
||||
|
@ -739,6 +743,8 @@ void JoinPBX::message_epoint(unsigned long epoint_id, int message_type, union pa
|
|||
case MESSAGE_RELEASE:
|
||||
PDEBUG(DEBUG_JOIN, "releasing from join\n");
|
||||
release(relation, 0, 0);
|
||||
if (j_relation && j_partyline_jingle)
|
||||
play_jingle(0);
|
||||
break;
|
||||
|
||||
default:
|
||||
|
@ -1026,3 +1032,20 @@ int JoinPBX::out_setup(unsigned long epoint_id, int message_type, union paramete
|
|||
}
|
||||
|
||||
|
||||
/* send play message to all members to play join/release jingle */
|
||||
void JoinPBX::play_jingle(int in)
|
||||
{
|
||||
struct join_relation *relation;
|
||||
struct message *message;
|
||||
|
||||
relation = j_relation;
|
||||
while(relation)
|
||||
{
|
||||
message = message_create(j_serial, relation->epoint_id, JOIN_TO_EPOINT, MESSAGE_TONE);
|
||||
SCPY(message->param.tone.name, (char *)((in)?"left":"joined"));
|
||||
message_put(message);
|
||||
relation = relation->next;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -69,12 +69,14 @@ class JoinPBX : public Join
|
|||
struct join_relation *j_relation; /* list of endpoints that are related to the join */
|
||||
|
||||
int j_partyline; /* if set, join is conference room */
|
||||
int j_partyline_jingle; /* also play jingle on join/leave */
|
||||
|
||||
void bridge(void);
|
||||
void bridge_data(unsigned long epoint_from, struct join_relation *relation_from, union parameter *param);
|
||||
void remove_relation(struct join_relation *relation);
|
||||
struct join_relation *add_relation(void);
|
||||
int out_setup(unsigned long epoint_id, int message, union parameter *param, char *newnumber);
|
||||
void play_jingle(int in);
|
||||
};
|
||||
|
||||
void joinpbx_debug(class JoinPBX *joinpbx, char *function);
|
||||
|
|
|
@ -249,6 +249,7 @@ struct message_setup {
|
|||
int port_type; /* type of port (only required if message is port -> epoint) */
|
||||
int dtmf; /* used to enabled dtmf dialing at setup state */
|
||||
int partyline; /* if set, call will be a conference room */
|
||||
int partyline_jingle; /* if set, the jingle will be played on conference join */
|
||||
struct caller_info callerinfo; /* information about the caller */
|
||||
struct dialing_info dialinginfo; /* information about dialing */
|
||||
struct redir_info redirinfo; /* info on redirection (to the calling user) */
|
||||
|
|
5
route.c
5
route.c
|
@ -220,6 +220,9 @@ struct param_defs param_defs[] = {
|
|||
{ PARAM_ROOM,
|
||||
"room", PARAM_TYPE_INTEGER,
|
||||
"room=<digits>", "Conference room number, must be greater 0, as in real life."},
|
||||
{ PARAM_JINGLE,
|
||||
"jingle", PARAM_TYPE_NULL,
|
||||
"jingle", "Conference members will hear a jingle if a member joins."},
|
||||
{ PARAM_TIMEOUT,
|
||||
"timeout", PARAM_TYPE_INTEGER,
|
||||
"timeout=<seconds>", "Timeout before continue with next action."},
|
||||
|
@ -258,7 +261,7 @@ struct action_defs action_defs[] = {
|
|||
"Caller is routed to the voice box of given extension."},
|
||||
{ ACTION_PARTYLINE,
|
||||
"partyline",&EndpointAppPBX::action_init_partyline, NULL, &EndpointAppPBX::action_hangup_call,
|
||||
PARAM_ROOM,
|
||||
PARAM_ROOM | PARAM_JINGLE,
|
||||
"Caller is participating the conference with the given room number."},
|
||||
{ ACTION_LOGIN,
|
||||
"login", NULL, &EndpointAppPBX::action_dialing_login, NULL,
|
||||
|
|
9
route.h
9
route.h
|
@ -131,10 +131,11 @@ enum { /* how to parse text file during startup */
|
|||
#define PARAM_CALLERIDTYPE (1LL<<37)
|
||||
#define PARAM_CALLTO (1LL<<38)
|
||||
#define PARAM_ROOM (1LL<<39)
|
||||
#define PARAM_TIMEOUT (1LL<<40)
|
||||
#define PARAM_NOPASSWORD (1LL<<41)
|
||||
#define PARAM_STRIP (1LL<<42)
|
||||
#define PARAM_APPLICATION (1LL<<43)
|
||||
#define PARAM_JINGLE (1LL<<40)
|
||||
#define PARAM_TIMEOUT (1LL<<41)
|
||||
#define PARAM_NOPASSWORD (1LL<<42)
|
||||
#define PARAM_STRIP (1LL<<43)
|
||||
#define PARAM_APPLICATION (1LL<<44)
|
||||
|
||||
|
||||
/* action index
|
||||
|
|
Loading…
Reference in New Issue