Asterisk - The Open Source Telephony Project GIT-master-77d630f
Data Structures | Macros | Enumerations | Functions | Variables
sig_analog.h File Reference

Interface header for analog signaling module. More...

#include "asterisk/channel.h"
#include "asterisk/frame.h"
#include "asterisk/smdi.h"
Include dependency graph for sig_analog.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Data Structures

struct  analog_callback
 
struct  analog_dialoperation
 
struct  analog_pvt
 
struct  analog_subchannel
 

Macros

#define ANALOG_FIRST_DIGIT_TIMEOUT   16000
 Default time (ms) to detect first digit. More...
 
#define ANALOG_INTER_DIGIT_TIMEOUT   8000
 Default time (ms) to detect following digits. More...
 
#define ANALOG_MATCH_DIGIT_TIMEOUT   3000
 Default time (ms) to wait, in case of ambiguous match. More...
 
#define ANALOG_MAX_CID   300
 
#define ANALOG_SMDI_MD_WAIT_TIMEOUT   1500 /* 1.5 seconds */
 
#define READ_SIZE   160
 
#define RING_PATTERNS   3
 

Enumerations

enum  analog_cid_start { ANALOG_CID_START_POLARITY = 1 , ANALOG_CID_START_POLARITY_IN , ANALOG_CID_START_RING , ANALOG_CID_START_DTMF_NOALERT }
 
enum  analog_dialmode { ANALOG_DIALMODE_BOTH = 0 , ANALOG_DIALMODE_PULSE , ANALOG_DIALMODE_DTMF , ANALOG_DIALMODE_NONE }
 
enum  analog_dsp_digitmode { ANALOG_DIGITMODE_DTMF = 1 , ANALOG_DIGITMODE_MF }
 
enum  analog_event {
  ANALOG_EVENT_NONE = 0 , ANALOG_EVENT_ONHOOK , ANALOG_EVENT_RINGOFFHOOK , ANALOG_EVENT_WINKFLASH ,
  ANALOG_EVENT_ALARM , ANALOG_EVENT_NOALARM , ANALOG_EVENT_DIALCOMPLETE , ANALOG_EVENT_RINGERON ,
  ANALOG_EVENT_RINGEROFF , ANALOG_EVENT_HOOKCOMPLETE , ANALOG_EVENT_PULSE_START , ANALOG_EVENT_POLARITY ,
  ANALOG_EVENT_RINGBEGIN , ANALOG_EVENT_EC_DISABLED , ANALOG_EVENT_REMOVED , ANALOG_EVENT_NEONMWI_ACTIVE ,
  ANALOG_EVENT_NEONMWI_INACTIVE , ANALOG_EVENT_TX_CED_DETECTED , ANALOG_EVENT_RX_CED_DETECTED , ANALOG_EVENT_EC_NLP_DISABLED ,
  ANALOG_EVENT_EC_NLP_ENABLED , ANALOG_EVENT_ERROR , ANALOG_EVENT_DTMFCID , ANALOG_EVENT_PULSEDIGIT = (1 << 16) ,
  ANALOG_EVENT_DTMFDOWN = (1 << 17) , ANALOG_EVENT_DTMFUP = (1 << 18)
}
 
enum  analog_sigtype {
  ANALOG_SIG_NONE = -1 , ANALOG_SIG_FXOLS = 1 , ANALOG_SIG_FXOKS , ANALOG_SIG_FXOGS ,
  ANALOG_SIG_FXSLS , ANALOG_SIG_FXSKS , ANALOG_SIG_FXSGS , ANALOG_SIG_EMWINK ,
  ANALOG_SIG_EM , ANALOG_SIG_EM_E1 , ANALOG_SIG_FEATD , ANALOG_SIG_FEATDMF ,
  ANALOG_SIG_E911 , ANALOG_SIG_FGC_CAMA , ANALOG_SIG_FGC_CAMAMF , ANALOG_SIG_FEATB ,
  ANALOG_SIG_SFWINK , ANALOG_SIG_SF , ANALOG_SIG_SF_FEATD , ANALOG_SIG_SF_FEATDMF ,
  ANALOG_SIG_FEATDMF_TA , ANALOG_SIG_SF_FEATB
}
 
enum  analog_sub { ANALOG_SUB_REAL = 0 , ANALOG_SUB_CALLWAIT , ANALOG_SUB_THREEWAY }
 
enum  analog_tone {
  ANALOG_TONE_RINGTONE = 0 , ANALOG_TONE_STUTTER , ANALOG_TONE_CONGESTION , ANALOG_TONE_DIALTONE ,
  ANALOG_TONE_DIALRECALL , ANALOG_TONE_INFO
}
 
enum  dialop { ANALOG_DIAL_OP_REPLACE = 2 }
 

Functions

int analog_answer (struct analog_pvt *p, struct ast_channel *ast)
 
int analog_available (struct analog_pvt *p)
 
int analog_call (struct analog_pvt *p, struct ast_channel *ast, const char *rdest, int timeout)
 
int analog_callwaiting_deluxe (struct analog_pvt *p, int option)
 
const char * analog_cidstart_to_str (enum analog_cid_start cid_start)
 
const char * analog_cidtype_to_str (unsigned int cid_type)
 
int analog_config_complete (struct analog_pvt *p)
 
void analog_delete (struct analog_pvt *doomed)
 Delete the analog private structure. More...
 
int analog_dnd (struct analog_pvt *p, int flag)
 
struct ast_frameanalog_exception (struct analog_pvt *p, struct ast_channel *ast)
 
int analog_fixup (struct ast_channel *oldchan, struct ast_channel *newchan, void *newp)
 
void analog_free (struct analog_pvt *p)
 
void analog_handle_dtmf (struct analog_pvt *p, struct ast_channel *ast, enum analog_sub index, struct ast_frame **dest)
 
void * analog_handle_init_event (struct analog_pvt *i, int event)
 
int analog_hangup (struct analog_pvt *p, struct ast_channel *ast)
 
struct analog_pvtanalog_new (enum analog_sigtype signallingtype, void *private_data)
 
struct ast_channelanalog_request (struct analog_pvt *p, int *callwait, const struct ast_channel *requestor)
 
const char * analog_sigtype_to_str (enum analog_sigtype sigtype)
 
int analog_ss_thread_start (struct analog_pvt *p, struct ast_channel *ast)
 
enum analog_cid_start analog_str_to_cidstart (const char *value)
 
unsigned int analog_str_to_cidtype (const char *name)
 
enum analog_sigtype analog_str_to_sigtype (const char *name)
 

Variables

struct analog_callback analog_callbacks
 

Detailed Description

Interface header for analog signaling module.

Author
Matthew Fredrickson cresl.nosp@m.in@d.nosp@m.igium.nosp@m..com

Definition in file sig_analog.h.

Macro Definition Documentation

◆ ANALOG_FIRST_DIGIT_TIMEOUT

#define ANALOG_FIRST_DIGIT_TIMEOUT   16000

Default time (ms) to detect first digit.

Definition at line 38 of file sig_analog.h.

◆ ANALOG_INTER_DIGIT_TIMEOUT

#define ANALOG_INTER_DIGIT_TIMEOUT   8000

Default time (ms) to detect following digits.

Definition at line 40 of file sig_analog.h.

◆ ANALOG_MATCH_DIGIT_TIMEOUT

#define ANALOG_MATCH_DIGIT_TIMEOUT   3000

Default time (ms) to wait, in case of ambiguous match.

Definition at line 42 of file sig_analog.h.

◆ ANALOG_MAX_CID

#define ANALOG_MAX_CID   300

Definition at line 33 of file sig_analog.h.

◆ ANALOG_SMDI_MD_WAIT_TIMEOUT

#define ANALOG_SMDI_MD_WAIT_TIMEOUT   1500 /* 1.5 seconds */

Definition at line 32 of file sig_analog.h.

◆ READ_SIZE

#define READ_SIZE   160

Definition at line 34 of file sig_analog.h.

◆ RING_PATTERNS

#define RING_PATTERNS   3

Definition at line 35 of file sig_analog.h.

Enumeration Type Documentation

◆ analog_cid_start

Enumerator
ANALOG_CID_START_POLARITY 
ANALOG_CID_START_POLARITY_IN 
ANALOG_CID_START_RING 
ANALOG_CID_START_DTMF_NOALERT 

Definition at line 126 of file sig_analog.h.

126 {
131};
@ ANALOG_CID_START_RING
Definition: sig_analog.h:129
@ ANALOG_CID_START_DTMF_NOALERT
Definition: sig_analog.h:130
@ ANALOG_CID_START_POLARITY
Definition: sig_analog.h:127
@ ANALOG_CID_START_POLARITY_IN
Definition: sig_analog.h:128

◆ analog_dialmode

Enumerator
ANALOG_DIALMODE_BOTH 
ANALOG_DIALMODE_PULSE 
ANALOG_DIALMODE_DTMF 
ANALOG_DIALMODE_NONE 

Definition at line 119 of file sig_analog.h.

119 {
124};
@ ANALOG_DIALMODE_DTMF
Definition: sig_analog.h:122
@ ANALOG_DIALMODE_PULSE
Definition: sig_analog.h:121
@ ANALOG_DIALMODE_NONE
Definition: sig_analog.h:123
@ ANALOG_DIALMODE_BOTH
Definition: sig_analog.h:120

◆ analog_dsp_digitmode

Enumerator
ANALOG_DIGITMODE_DTMF 
ANALOG_DIGITMODE_MF 

Definition at line 114 of file sig_analog.h.

114 {
117};
@ ANALOG_DIGITMODE_DTMF
Definition: sig_analog.h:115
@ ANALOG_DIGITMODE_MF
Definition: sig_analog.h:116

◆ analog_event

Enumerator
ANALOG_EVENT_NONE 
ANALOG_EVENT_ONHOOK 
ANALOG_EVENT_RINGOFFHOOK 
ANALOG_EVENT_WINKFLASH 
ANALOG_EVENT_ALARM 
ANALOG_EVENT_NOALARM 
ANALOG_EVENT_DIALCOMPLETE 
ANALOG_EVENT_RINGERON 
ANALOG_EVENT_RINGEROFF 
ANALOG_EVENT_HOOKCOMPLETE 
ANALOG_EVENT_PULSE_START 
ANALOG_EVENT_POLARITY 
ANALOG_EVENT_RINGBEGIN 
ANALOG_EVENT_EC_DISABLED 
ANALOG_EVENT_REMOVED 
ANALOG_EVENT_NEONMWI_ACTIVE 
ANALOG_EVENT_NEONMWI_INACTIVE 
ANALOG_EVENT_TX_CED_DETECTED 
ANALOG_EVENT_RX_CED_DETECTED 
ANALOG_EVENT_EC_NLP_DISABLED 
ANALOG_EVENT_EC_NLP_ENABLED 
ANALOG_EVENT_ERROR 
ANALOG_EVENT_DTMFCID 
ANALOG_EVENT_PULSEDIGIT 
ANALOG_EVENT_DTMFDOWN 
ANALOG_EVENT_DTMFUP 

Definition at line 79 of file sig_analog.h.

79 {
101 ANALOG_EVENT_ERROR, /* not a DAHDI event */
102 ANALOG_EVENT_DTMFCID, /* not a DAHDI event */
103 ANALOG_EVENT_PULSEDIGIT = (1 << 16),
104 ANALOG_EVENT_DTMFDOWN = (1 << 17),
105 ANALOG_EVENT_DTMFUP = (1 << 18),
106};
@ ANALOG_EVENT_NONE
Definition: sig_analog.h:80
@ ANALOG_EVENT_HOOKCOMPLETE
Definition: sig_analog.h:89
@ ANALOG_EVENT_DTMFDOWN
Definition: sig_analog.h:104
@ ANALOG_EVENT_RINGEROFF
Definition: sig_analog.h:88
@ ANALOG_EVENT_PULSE_START
Definition: sig_analog.h:90
@ ANALOG_EVENT_DTMFCID
Definition: sig_analog.h:102
@ ANALOG_EVENT_TX_CED_DETECTED
Definition: sig_analog.h:97
@ ANALOG_EVENT_NEONMWI_ACTIVE
Definition: sig_analog.h:95
@ ANALOG_EVENT_RINGBEGIN
Definition: sig_analog.h:92
@ ANALOG_EVENT_ONHOOK
Definition: sig_analog.h:81
@ ANALOG_EVENT_EC_DISABLED
Definition: sig_analog.h:93
@ ANALOG_EVENT_WINKFLASH
Definition: sig_analog.h:83
@ ANALOG_EVENT_ERROR
Definition: sig_analog.h:101
@ ANALOG_EVENT_PULSEDIGIT
Definition: sig_analog.h:103
@ ANALOG_EVENT_RINGERON
Definition: sig_analog.h:87
@ ANALOG_EVENT_RX_CED_DETECTED
Definition: sig_analog.h:98
@ ANALOG_EVENT_ALARM
Definition: sig_analog.h:84
@ ANALOG_EVENT_DIALCOMPLETE
Definition: sig_analog.h:86
@ ANALOG_EVENT_EC_NLP_ENABLED
Definition: sig_analog.h:100
@ ANALOG_EVENT_POLARITY
Definition: sig_analog.h:91
@ ANALOG_EVENT_NEONMWI_INACTIVE
Definition: sig_analog.h:96
@ ANALOG_EVENT_DTMFUP
Definition: sig_analog.h:105
@ ANALOG_EVENT_EC_NLP_DISABLED
Definition: sig_analog.h:99
@ ANALOG_EVENT_RINGOFFHOOK
Definition: sig_analog.h:82
@ ANALOG_EVENT_REMOVED
Definition: sig_analog.h:94
@ ANALOG_EVENT_NOALARM
Definition: sig_analog.h:85

◆ analog_sigtype

Enumerator
ANALOG_SIG_NONE 
ANALOG_SIG_FXOLS 
ANALOG_SIG_FXOKS 
ANALOG_SIG_FXOGS 
ANALOG_SIG_FXSLS 
ANALOG_SIG_FXSKS 
ANALOG_SIG_FXSGS 
ANALOG_SIG_EMWINK 
ANALOG_SIG_EM 
ANALOG_SIG_EM_E1 
ANALOG_SIG_FEATD 
ANALOG_SIG_FEATDMF 
ANALOG_SIG_E911 
ANALOG_SIG_FGC_CAMA 
ANALOG_SIG_FGC_CAMAMF 
ANALOG_SIG_FEATB 
ANALOG_SIG_SFWINK 
ANALOG_SIG_SF 
ANALOG_SIG_SF_FEATD 
ANALOG_SIG_SF_FEATDMF 
ANALOG_SIG_FEATDMF_TA 
ANALOG_SIG_SF_FEATB 

Definition at line 45 of file sig_analog.h.

45 {
46 ANALOG_SIG_NONE = -1,
68};
@ ANALOG_SIG_FEATD
Definition: sig_analog.h:56
@ ANALOG_SIG_FEATDMF_TA
Definition: sig_analog.h:66
@ ANALOG_SIG_FGC_CAMAMF
Definition: sig_analog.h:60
@ ANALOG_SIG_FXOLS
Definition: sig_analog.h:47
@ ANALOG_SIG_FEATDMF
Definition: sig_analog.h:57
@ ANALOG_SIG_EM_E1
Definition: sig_analog.h:55
@ ANALOG_SIG_EMWINK
Definition: sig_analog.h:53
@ ANALOG_SIG_FXOKS
Definition: sig_analog.h:48
@ ANALOG_SIG_SF
Definition: sig_analog.h:63
@ ANALOG_SIG_FGC_CAMA
Definition: sig_analog.h:59
@ ANALOG_SIG_FXSLS
Definition: sig_analog.h:50
@ ANALOG_SIG_EM
Definition: sig_analog.h:54
@ ANALOG_SIG_FXOGS
Definition: sig_analog.h:49
@ ANALOG_SIG_SF_FEATB
Definition: sig_analog.h:67
@ ANALOG_SIG_NONE
Definition: sig_analog.h:46
@ ANALOG_SIG_FXSGS
Definition: sig_analog.h:52
@ ANALOG_SIG_SF_FEATDMF
Definition: sig_analog.h:65
@ ANALOG_SIG_SFWINK
Definition: sig_analog.h:62
@ ANALOG_SIG_E911
Definition: sig_analog.h:58
@ ANALOG_SIG_FEATB
Definition: sig_analog.h:61
@ ANALOG_SIG_SF_FEATD
Definition: sig_analog.h:64
@ ANALOG_SIG_FXSKS
Definition: sig_analog.h:51

◆ analog_sub

enum analog_sub
Enumerator
ANALOG_SUB_REAL 

Active call

ANALOG_SUB_CALLWAIT 

Call-Waiting call on hold

ANALOG_SUB_THREEWAY 

Three-way call

Definition at line 108 of file sig_analog.h.

108 {
109 ANALOG_SUB_REAL = 0, /*!< Active call */
110 ANALOG_SUB_CALLWAIT, /*!< Call-Waiting call on hold */
111 ANALOG_SUB_THREEWAY, /*!< Three-way call */
112};
@ ANALOG_SUB_THREEWAY
Definition: sig_analog.h:111
@ ANALOG_SUB_REAL
Definition: sig_analog.h:109
@ ANALOG_SUB_CALLWAIT
Definition: sig_analog.h:110

◆ analog_tone

Enumerator
ANALOG_TONE_RINGTONE 
ANALOG_TONE_STUTTER 
ANALOG_TONE_CONGESTION 
ANALOG_TONE_DIALTONE 
ANALOG_TONE_DIALRECALL 
ANALOG_TONE_INFO 

Definition at line 70 of file sig_analog.h.

70 {
77};
@ ANALOG_TONE_CONGESTION
Definition: sig_analog.h:73
@ ANALOG_TONE_INFO
Definition: sig_analog.h:76
@ ANALOG_TONE_DIALTONE
Definition: sig_analog.h:74
@ ANALOG_TONE_DIALRECALL
Definition: sig_analog.h:75
@ ANALOG_TONE_STUTTER
Definition: sig_analog.h:72
@ ANALOG_TONE_RINGTONE
Definition: sig_analog.h:71

◆ dialop

enum dialop
Enumerator
ANALOG_DIAL_OP_REPLACE 

Definition at line 133 of file sig_analog.h.

133 {
135};
@ ANALOG_DIAL_OP_REPLACE
Definition: sig_analog.h:134

Function Documentation

◆ analog_answer()

int analog_answer ( struct analog_pvt p,
struct ast_channel ast 
)

Definition at line 1506 of file sig_analog.c.

1507{
1508 int res = 0;
1509 int idx;
1510 int oldstate = ast_channel_state(ast);
1511
1512 ast_debug(1, "%s %d\n", __FUNCTION__, p->channel);
1514 idx = analog_get_index(ast, p, 1);
1515 if (idx < 0) {
1516 idx = ANALOG_SUB_REAL;
1517 }
1518 switch (p->sig) {
1519 case ANALOG_SIG_FXSLS:
1520 case ANALOG_SIG_FXSGS:
1521 case ANALOG_SIG_FXSKS:
1523 /* Fall through */
1524 case ANALOG_SIG_EM:
1525 case ANALOG_SIG_EM_E1:
1526 case ANALOG_SIG_EMWINK:
1527 case ANALOG_SIG_FEATD:
1528 case ANALOG_SIG_FEATDMF:
1530 case ANALOG_SIG_E911:
1533 case ANALOG_SIG_FEATB:
1534 case ANALOG_SIG_SF:
1535 case ANALOG_SIG_SFWINK:
1539 case ANALOG_SIG_FXOLS:
1540 case ANALOG_SIG_FXOGS:
1541 case ANALOG_SIG_FXOKS:
1542 /* Pick up the line */
1543 ast_debug(1, "Took %s off hook\n", ast_channel_name(ast));
1544 if (p->hanguponpolarityswitch) {
1545 gettimeofday(&p->polaritydelaytv, NULL);
1546 }
1547 res = analog_off_hook(p);
1548 analog_play_tone(p, idx, -1);
1549 analog_set_dialing(p, 0);
1550 if ((idx == ANALOG_SUB_REAL) && p->subs[ANALOG_SUB_THREEWAY].inthreeway) {
1551 if (oldstate == AST_STATE_RINGING) {
1552 ast_debug(1, "Finally swapping real and threeway\n");
1556 }
1557 }
1558
1559 switch (p->sig) {
1560 case ANALOG_SIG_FXSLS:
1561 case ANALOG_SIG_FXSKS:
1562 case ANALOG_SIG_FXSGS:
1565 break;
1566 case ANALOG_SIG_FXOLS:
1567 case ANALOG_SIG_FXOKS:
1568 case ANALOG_SIG_FXOGS:
1570 break;
1571 default:
1572 break;
1573 }
1574 break;
1575 default:
1576 ast_log(LOG_WARNING, "Don't know how to answer signalling %d (channel %d)\n", p->sig, p->channel);
1577 res = -1;
1578 break;
1579 }
1581 return res;
1582}
#define ast_log
Definition: astobj2.c:42
const char * ast_channel_name(const struct ast_channel *chan)
ast_channel_state
ast_channel states
Definition: channelstate.h:35
@ AST_STATE_RINGING
Definition: channelstate.h:41
@ AST_STATE_UP
Definition: channelstate.h:42
int ast_setstate(struct ast_channel *chan, enum ast_channel_state)
Change the state of a channel.
Definition: channel.c:7368
#define ast_debug(level,...)
Log a DEBUG message.
#define LOG_WARNING
#define NULL
Definition: resample.c:96
static void analog_set_new_owner(struct analog_pvt *p, struct ast_channel *new_owner)
Definition: sig_analog.c:452
static int analog_train_echocanceller(struct analog_pvt *p)
Definition: sig_analog.c:487
static void analog_set_dialing(struct analog_pvt *p, int is_dialing)
Definition: sig_analog.c:911
static void analog_set_ringtimeout(struct analog_pvt *p, int ringt)
Definition: sig_analog.c:927
#define analog_get_index(ast, p, nullok)
Definition: sig_analog.c:413
static void analog_answer_polarityswitch(struct analog_pvt *p)
Definition: sig_analog.c:651
static int analog_off_hook(struct analog_pvt *p)
Definition: sig_analog.c:621
static int analog_play_tone(struct analog_pvt *p, enum analog_sub sub, enum analog_tone tone)
Definition: sig_analog.c:444
static int analog_set_echocanceller(struct analog_pvt *p, int enable)
Definition: sig_analog.c:479
static void analog_swap_subs(struct analog_pvt *p, enum analog_sub a, enum analog_sub b)
Definition: sig_analog.c:348
struct timeval polaritydelaytv
Definition: sig_analog.h:371
unsigned int hanguponpolarityswitch
Definition: sig_analog.h:297
enum analog_sigtype sig
Definition: sig_analog.h:273
struct analog_subchannel subs[3]
Definition: sig_analog.h:279
unsigned int inthreeway
Definition: sig_analog.h:266
struct ast_channel * owner
Definition: sig_analog.h:264

References analog_answer_polarityswitch(), analog_get_index, analog_off_hook(), analog_play_tone(), analog_set_dialing(), analog_set_echocanceller(), analog_set_new_owner(), analog_set_ringtimeout(), ANALOG_SIG_E911, ANALOG_SIG_EM, ANALOG_SIG_EM_E1, ANALOG_SIG_EMWINK, ANALOG_SIG_FEATB, ANALOG_SIG_FEATD, ANALOG_SIG_FEATDMF, ANALOG_SIG_FEATDMF_TA, ANALOG_SIG_FGC_CAMA, ANALOG_SIG_FGC_CAMAMF, ANALOG_SIG_FXOGS, ANALOG_SIG_FXOKS, ANALOG_SIG_FXOLS, ANALOG_SIG_FXSGS, ANALOG_SIG_FXSKS, ANALOG_SIG_FXSLS, ANALOG_SIG_SF, ANALOG_SIG_SF_FEATB, ANALOG_SIG_SF_FEATD, ANALOG_SIG_SF_FEATDMF, ANALOG_SIG_SFWINK, ANALOG_SUB_REAL, ANALOG_SUB_THREEWAY, analog_swap_subs(), analog_train_echocanceller(), ast_channel_name(), ast_debug, ast_log, ast_setstate(), AST_STATE_RINGING, AST_STATE_UP, analog_pvt::channel, analog_pvt::hanguponpolarityswitch, analog_subchannel::inthreeway, LOG_WARNING, NULL, analog_subchannel::owner, analog_pvt::polaritydelaytv, analog_pvt::sig, and analog_pvt::subs.

Referenced by dahdi_answer().

◆ analog_available()

int analog_available ( struct analog_pvt p)

Definition at line 799 of file sig_analog.c.

800{
801 int offhook;
802
803 ast_debug(1, "%s %d\n", __FUNCTION__, p->channel);
804
805 /* If do not disturb, definitely not */
806 if (p->dnd) {
807 return 0;
808 }
809 /* If guard time, definitely not */
810 if (p->guardtime && (time(NULL) < p->guardtime)) {
811 return 0;
812 }
813
814 /* If line is being held, definitely not (don't allow call waitings to an on-hook phone) */
815 if (p->cshactive) {
816 return 0;
817 }
818
819 /* If no owner definitely available */
820 if (!p->owner) {
821 offhook = analog_is_off_hook(p);
822
823 /* TDM FXO card, "onhook" means out of service (no battery on the line) */
824 if ((p->sig == ANALOG_SIG_FXSLS) || (p->sig == ANALOG_SIG_FXSKS) || (p->sig == ANALOG_SIG_FXSGS)) {
825#ifdef DAHDI_CHECK_HOOKSTATE
826 if (offhook) {
827 return 1;
828 }
829 return 0;
830#endif
831 /* TDM FXS card, "offhook" means someone took the hook off so it's unavailable! */
832 } else if (offhook) {
833 ast_debug(1, "Channel %d off hook, can't use\n", p->channel);
834 /* Not available when the other end is off hook */
835 return 0;
836 }
837 return 1;
838 }
839
840 /* If it's not an FXO, forget about call wait */
841 if ((p->sig != ANALOG_SIG_FXOKS) && (p->sig != ANALOG_SIG_FXOLS) && (p->sig != ANALOG_SIG_FXOGS)) {
842 return 0;
843 }
844
845 if (!p->callwaiting) {
846 /* If they don't have call waiting enabled, then for sure they're unavailable at this point */
847 return 0;
848 }
849
851 /* If there is already a call waiting call, then we can't take a second one */
852 return 0;
853 }
854
855 if ((ast_channel_state(p->owner) != AST_STATE_UP) &&
857 /* If the current call is not up, then don't allow the call */
858 return 0;
859 }
861 /* Can't take a call wait when the three way calling hasn't been merged yet. */
862 return 0;
863 }
864 /* We're cool */
865 return 1;
866}
static int analog_is_off_hook(struct analog_pvt *p)
Definition: sig_analog.c:495
unsigned int dnd
Definition: sig_analog.h:340
unsigned int outgoing
Definition: sig_analog.h:343
unsigned int callwaiting
Definition: sig_analog.h:336
time_t guardtime
Definition: sig_analog.h:373
unsigned int cshactive
Definition: sig_analog.h:337
struct ast_channel * owner
Definition: sig_analog.h:277
unsigned int allocd
Definition: sig_analog.h:268

References analog_subchannel::allocd, analog_is_off_hook(), ANALOG_SIG_FXOGS, ANALOG_SIG_FXOKS, ANALOG_SIG_FXOLS, ANALOG_SIG_FXSGS, ANALOG_SIG_FXSKS, ANALOG_SIG_FXSLS, ANALOG_SUB_CALLWAIT, ANALOG_SUB_THREEWAY, ast_debug, AST_STATE_RINGING, AST_STATE_UP, analog_pvt::callwaiting, analog_pvt::channel, analog_pvt::cshactive, analog_pvt::dnd, analog_pvt::guardtime, analog_subchannel::inthreeway, NULL, analog_pvt::outgoing, analog_subchannel::owner, analog_pvt::owner, analog_pvt::sig, and analog_pvt::subs.

Referenced by available().

◆ analog_call()

int analog_call ( struct analog_pvt p,
struct ast_channel ast,
const char *  rdest,
int  timeout 
)

Definition at line 1006 of file sig_analog.c.

1007{
1008 int res, idx, mysig;
1009 char *c, *n, *l;
1010 char dest[256]; /* must be same length as p->dialdest */
1011
1012 ast_debug(1, "CALLING CID_NAME: %s CID_NUM:: %s\n",
1013 S_COR(ast_channel_connected(ast)->id.name.valid, ast_channel_connected(ast)->id.name.str, ""),
1014 S_COR(ast_channel_connected(ast)->id.number.valid, ast_channel_connected(ast)->id.number.str, ""));
1015
1016 ast_copy_string(dest, rdest, sizeof(dest));
1017 ast_copy_string(p->dialdest, rdest, sizeof(p->dialdest));
1018
1019 if ((ast_channel_state(ast) == AST_STATE_BUSY)) {
1021 return 0;
1022 }
1023
1025 ast_log(LOG_WARNING, "analog_call called on %s, neither down nor reserved\n", ast_channel_name(ast));
1026 return -1;
1027 }
1028
1029 p->dialednone = 0;
1030 analog_set_outgoing(p, 1);
1031
1032 mysig = p->sig;
1033 if (p->outsigmod > -1) {
1034 mysig = p->outsigmod;
1035 }
1036
1037 switch (mysig) {
1038 case ANALOG_SIG_FXOLS:
1039 case ANALOG_SIG_FXOGS:
1040 case ANALOG_SIG_FXOKS:
1041 if (p->owner == ast) {
1042 /* Normal ring, on hook */
1043
1044 /* Don't send audio while on hook, until the call is answered */
1045 analog_set_dialing(p, 1);
1046 analog_set_cadence(p, ast); /* and set p->cidrings */
1047
1048 /* nick@dccinc.com 4/3/03 mods to allow for deferred dialing */
1049 c = strchr(dest, '/');
1050 if (c) {
1051 c++;
1052 }
1053 if (c && (strlen(c) < p->stripmsd)) {
1054 ast_log(LOG_WARNING, "Number '%s' is shorter than stripmsd (%d)\n", c, p->stripmsd);
1055 c = NULL;
1056 }
1057 if (c && (strlen(c) > sizeof(p->dop.dialstr) - 3 /* "Tw\0" */)) {
1058 ast_log(LOG_WARNING, "Number '%s' is longer than %d bytes\n", c, (int)sizeof(p->dop.dialstr) - 2);
1059 c = NULL;
1060 }
1061 if (c) {
1063 snprintf(p->dop.dialstr, sizeof(p->dop.dialstr), "Tw%s", c);
1064 ast_debug(1, "FXO: setup deferred dialstring: %s\n", c);
1065 } else {
1066 p->dop.dialstr[0] = '\0';
1067 }
1068
1069 if (analog_ring(p)) {
1070 ast_log(LOG_WARNING, "Unable to ring phone: %s\n", strerror(errno));
1071 return -1;
1072 }
1073 analog_set_dialing(p, 1);
1074 } else {
1075 /* Call waiting call */
1076 if (ast_channel_connected(ast)->id.number.valid && ast_channel_connected(ast)->id.number.str) {
1078 } else {
1079 p->callwait_num[0] = '\0';
1080 }
1081 if (ast_channel_connected(ast)->id.name.valid && ast_channel_connected(ast)->id.name.str) {
1083 } else {
1084 p->callwait_name[0] = '\0';
1085 }
1086
1087 /* Call waiting tone instead */
1088 if (analog_callwait(p)) {
1089 return -1;
1090 }
1091 /* Make ring-back */
1093 ast_log(LOG_WARNING, "Unable to generate call-wait ring-back on channel %s\n", ast_channel_name(ast));
1094 }
1095
1096 }
1097
1098 /* Name and Number */
1101 if (l) {
1102 ast_copy_string(p->lastcid_num, l, sizeof(p->lastcid_num));
1103 } else {
1104 p->lastcid_num[0] = '\0';
1105 }
1106 if (n) {
1107 ast_copy_string(p->lastcid_name, n, sizeof(p->lastcid_name));
1108 } else {
1109 p->lastcid_name[0] = '\0';
1110 }
1111
1112 if (p->use_callerid) {
1113 const char *qual_var;
1114
1115 /* Caller ID Name and Number */
1116 p->caller.id.name.str = p->lastcid_name;
1117 p->caller.id.number.str = p->lastcid_num;
1122
1123 /* Redirecting Reason */
1125
1126 /* Call Qualifier */
1127 ast_channel_lock(ast);
1128 /* XXX In the future, we may want to make this a CALLERID or CHANNEL property and fetch it from there. */
1129 qual_var = pbx_builtin_getvar_helper(ast, "CALL_QUALIFIER");
1130 p->call_qualifier = ast_true(qual_var) ? 1 : 0;
1131 ast_channel_unlock(ast);
1132 }
1133
1135 idx = analog_get_index(ast, p, 0);
1136 if (idx > -1) {
1137 struct ast_cc_config_params *cc_params;
1138
1139 /* This is where the initial ringing frame is queued for an analog call.
1140 * As such, this is a great time to offer CCNR to the caller if it's available.
1141 */
1142 cc_params = ast_channel_get_cc_config_params(p->subs[idx].owner);
1143 if (cc_params) {
1144 switch (ast_get_cc_monitor_policy(cc_params)) {
1146 break;
1152 break;
1153 }
1154 }
1156 }
1157 break;
1158 case ANALOG_SIG_FXSLS:
1159 case ANALOG_SIG_FXSGS:
1160 case ANALOG_SIG_FXSKS:
1162 ast_debug(1, "Ignore possible polarity reversal on line seizure\n");
1164 }
1165 /* fall through */
1166 case ANALOG_SIG_EMWINK:
1167 case ANALOG_SIG_EM:
1168 case ANALOG_SIG_EM_E1:
1169 case ANALOG_SIG_FEATD:
1170 case ANALOG_SIG_FEATDMF:
1171 case ANALOG_SIG_E911:
1174 case ANALOG_SIG_FEATB:
1175 case ANALOG_SIG_SFWINK:
1176 case ANALOG_SIG_SF:
1181 c = strchr(dest, '/');
1182 if (c) {
1183 c++;
1184 } else {
1185 c = "";
1186 }
1187 if (strlen(c) < p->stripmsd) {
1188 ast_log(LOG_WARNING, "Number '%s' is shorter than stripmsd (%d)\n", c, p->stripmsd);
1189 return -1;
1190 }
1191 res = analog_start(p);
1192 if (res < 0) {
1193 if (errno != EINPROGRESS) {
1194 return -1;
1195 }
1196 }
1197 ast_debug(1, "Dialing '%s'\n", c);
1199
1200 c += p->stripmsd;
1201
1202 switch (mysig) {
1203 case ANALOG_SIG_FEATD:
1205 if (l) {
1206 snprintf(p->dop.dialstr, sizeof(p->dop.dialstr), "T*%s*%s*", l, c);
1207 } else {
1208 snprintf(p->dop.dialstr, sizeof(p->dop.dialstr), "T**%s*", c);
1209 }
1210 break;
1211 case ANALOG_SIG_FEATDMF:
1213 if (l) {
1214 snprintf(p->dop.dialstr, sizeof(p->dop.dialstr), "M*00%s#*%s#", l, c);
1215 } else {
1216 snprintf(p->dop.dialstr, sizeof(p->dop.dialstr), "M*02#*%s#", c);
1217 }
1218 break;
1220 {
1221 const char *cic = "", *ozz = "";
1222
1223 /* If you have to go through a Tandem Access point you need to use this */
1224#ifndef STANDALONE
1225 ozz = pbx_builtin_getvar_helper(p->owner, "FEATDMF_OZZ");
1226 if (!ozz) {
1227 ozz = analog_defaultozz;
1228 }
1229 cic = pbx_builtin_getvar_helper(p->owner, "FEATDMF_CIC");
1230 if (!cic) {
1231 cic = analog_defaultcic;
1232 }
1233#endif
1234 if (!ozz || !cic) {
1235 ast_log(LOG_WARNING, "Unable to dial channel of type feature group D MF tandem access without CIC or OZZ set\n");
1236 return -1;
1237 }
1238 snprintf(p->dop.dialstr, sizeof(p->dop.dialstr), "M*%s%s#", ozz, cic);
1239 snprintf(p->finaldial, sizeof(p->finaldial), "M*%s#", c);
1240 p->whichwink = 0;
1241 }
1242 break;
1243 case ANALOG_SIG_E911:
1244 ast_copy_string(p->dop.dialstr, "M*911#", sizeof(p->dop.dialstr));
1245 break;
1247 snprintf(p->dop.dialstr, sizeof(p->dop.dialstr), "P%s", c);
1248 break;
1250 case ANALOG_SIG_FEATB:
1251 snprintf(p->dop.dialstr, sizeof(p->dop.dialstr), "M*%s#", c);
1252 break;
1253 default:
1254 if (p->pulse) {
1255 snprintf(p->dop.dialstr, sizeof(p->dop.dialstr), "P%sw", c);
1256 } else {
1257 snprintf(p->dop.dialstr, sizeof(p->dop.dialstr), "T%sw", c);
1258 }
1259 break;
1260 }
1261
1262 if (p->echotraining && (strlen(p->dop.dialstr) > 4)) {
1263 memset(p->echorest, 'w', sizeof(p->echorest) - 1);
1264 strcpy(p->echorest + (p->echotraining / 400) + 1, p->dop.dialstr + strlen(p->dop.dialstr) - 2);
1265 p->echorest[sizeof(p->echorest) - 1] = '\0';
1266 p->echobreak = 1;
1267 p->dop.dialstr[strlen(p->dop.dialstr)-2] = '\0';
1268 } else {
1269 p->echobreak = 0;
1270 }
1272 if (!res) {
1273 if (analog_dial_digits(p, ANALOG_SUB_REAL, &p->dop)) {
1274 analog_on_hook(p);
1275 return -1;
1276 }
1277 } else {
1278 ast_debug(1, "Deferring dialing...\n");
1279 }
1280 analog_set_dialing(p, 1);
1281 if (ast_strlen_zero(c)) {
1282 p->dialednone = 1;
1283 }
1285 break;
1286 default:
1287 ast_debug(1, "not yet implemented\n");
1288 return -1;
1289 }
1290 return 0;
1291}
#define AST_CC_GENERIC_MONITOR_TYPE
Definition: ccss.h:455
@ AST_CC_CCNR
Definition: ccss.h:38
@ AST_CC_MONITOR_NEVER
Definition: ccss.h:76
@ AST_CC_MONITOR_ALWAYS
Definition: ccss.h:87
@ AST_CC_MONITOR_NATIVE
Definition: ccss.h:78
@ AST_CC_MONITOR_GENERIC
Definition: ccss.h:83
enum ast_cc_monitor_policies ast_get_cc_monitor_policy(struct ast_cc_config_params *config)
Get the cc_monitor_policy.
Definition: ccss.c:882
int ast_queue_cc_frame(struct ast_channel *chan, const char *const monitor_type, const char *const dialstring, enum ast_cc_service_type service, void *private_data)
Queue an AST_CONTROL_CC frame.
Definition: ccss.c:4120
#define ast_channel_lock(chan)
Definition: channel.h:2972
struct ast_party_redirecting * ast_channel_redirecting(struct ast_channel *chan)
int ast_queue_control(struct ast_channel *chan, enum ast_control_frame_type control)
Queue a control frame without payload.
Definition: channel.c:1270
struct ast_party_connected_line * ast_channel_connected(struct ast_channel *chan)
struct ast_cc_config_params * ast_channel_get_cc_config_params(struct ast_channel *chan)
Get the CCSS parameters from a channel.
Definition: channel.c:10488
#define ast_channel_unlock(chan)
Definition: channel.h:2973
@ AST_STATE_DOWN
Definition: channelstate.h:36
@ AST_STATE_BUSY
Definition: channelstate.h:43
@ AST_STATE_DIALING
Definition: channelstate.h:39
@ AST_STATE_RESERVED
Definition: channelstate.h:37
@ AST_CONTROL_BUSY
@ AST_CONTROL_RINGING
int errno
const char * pbx_builtin_getvar_helper(struct ast_channel *chan, const char *name)
Return a pointer to the value of the corresponding channel variable.
static const char * analog_get_orig_dialstring(struct analog_pvt *p)
Definition: sig_analog.c:186
static char analog_defaultozz[64]
Definition: sig_analog.c:66
static int analog_callwait(struct analog_pvt *p)
Definition: sig_analog.c:887
static void analog_set_outgoing(struct analog_pvt *p, int is_outgoing)
Definition: sig_analog.c:543
static char analog_defaultcic[64]
Definition: sig_analog.c:65
static int analog_dial_digits(struct analog_pvt *p, enum analog_sub sub, struct analog_dialoperation *dop)
Definition: sig_analog.c:527
static int analog_ring(struct analog_pvt *p)
Definition: sig_analog.c:503
static void analog_set_cadence(struct analog_pvt *p, struct ast_channel *chan)
Definition: sig_analog.c:904
const char * name
Definition: sig_analog.c:70
static int analog_on_hook(struct analog_pvt *p)
Definition: sig_analog.c:535
static int analog_start(struct analog_pvt *p)
Definition: sig_analog.c:519
static void analog_set_waitingfordt(struct analog_pvt *p, struct ast_channel *ast)
Definition: sig_analog.c:935
int attribute_pure ast_true(const char *val)
Make sure something is true. Determine if a string containing a boolean value is "true"....
Definition: utils.c:2235
#define S_COR(a, b, c)
returns the equivalent of logic or for strings, with an additional boolean check: second one if not e...
Definition: strings.h:87
static force_inline int attribute_pure ast_strlen_zero(const char *s)
Definition: strings.h:65
void ast_copy_string(char *dst, const char *src, size_t size)
Size-limited null-terminating string copy.
Definition: strings.h:425
char dialdest[256]
Definition: sig_analog.h:372
struct analog_dialoperation dop
Definition: sig_analog.h:280
int redirecting_reason
Definition: sig_analog.h:366
int whichwink
Definition: sig_analog.h:375
enum analog_sigtype outsigmod
Definition: sig_analog.h:323
unsigned int answeronpolarityswitch
Definition: sig_analog.h:291
unsigned int pulse
Definition: sig_analog.h:305
int echotraining
Definition: sig_analog.h:325
char callwait_num[AST_MAX_EXTENSION]
Definition: sig_analog.h:360
unsigned int echobreak
Definition: sig_analog.h:341
char lastcid_name[AST_MAX_EXTENSION]
Definition: sig_analog.h:363
unsigned int dialednone
Definition: sig_analog.h:338
unsigned int call_qualifier
Definition: sig_analog.h:358
char echorest[20]
Definition: sig_analog.h:369
char lastcid_num[AST_MAX_EXTENSION]
Definition: sig_analog.h:362
char finaldial[64]
Definition: sig_analog.h:376
int stripmsd
Definition: sig_analog.h:328
unsigned int use_callerid
Definition: sig_analog.h:310
char callwait_name[AST_MAX_EXTENSION]
Definition: sig_analog.h:361
struct ast_party_caller caller
Definition: sig_analog.h:365
struct ast_party_id id
Caller party ID.
Definition: channel.h:422
struct ast_party_id id
Connected party ID.
Definition: channel.h:460
struct ast_party_name name
Subscriber name.
Definition: channel.h:342
struct ast_party_number number
Subscriber phone number.
Definition: channel.h:344
int presentation
Q.931 encoded presentation-indicator encoded field.
Definition: channel.h:279
unsigned char valid
TRUE if the name information is valid/present.
Definition: channel.h:281
char * str
Subscriber name (Malloced)
Definition: channel.h:266
int presentation
Q.931 presentation-indicator and screening-indicator encoded fields.
Definition: channel.h:297
unsigned char valid
TRUE if the number information is valid/present.
Definition: channel.h:299
char * str
Subscriber phone number (Malloced)
Definition: channel.h:293
int code
enum AST_REDIRECTING_REASON value for redirection
Definition: channel.h:512
struct ast_party_redirecting_reason reason
Reason for the redirection.
Definition: channel.h:544
struct ast_party_id from
Who is redirecting the call (Sent to the party the call is redirected toward)
Definition: channel.h:529
Number structure.
Definition: app_followme.c:157
static struct test_val c
struct timeval ast_tvnow(void)
Returns current timeval. Meant to replace calls to gettimeofday().
Definition: time.h:159

References analog_callwait(), analog_defaultcic, analog_defaultozz, analog_dial_digits(), ANALOG_DIAL_OP_REPLACE, analog_get_index, analog_get_orig_dialstring(), analog_on_hook(), analog_play_tone(), analog_ring(), analog_set_cadence(), analog_set_dialing(), analog_set_outgoing(), analog_set_waitingfordt(), ANALOG_SIG_E911, ANALOG_SIG_EM, ANALOG_SIG_EM_E1, ANALOG_SIG_EMWINK, ANALOG_SIG_FEATB, ANALOG_SIG_FEATD, ANALOG_SIG_FEATDMF, ANALOG_SIG_FEATDMF_TA, ANALOG_SIG_FGC_CAMA, ANALOG_SIG_FGC_CAMAMF, ANALOG_SIG_FXOGS, ANALOG_SIG_FXOKS, ANALOG_SIG_FXOLS, ANALOG_SIG_FXSGS, ANALOG_SIG_FXSKS, ANALOG_SIG_FXSLS, ANALOG_SIG_SF, ANALOG_SIG_SF_FEATB, ANALOG_SIG_SF_FEATD, ANALOG_SIG_SF_FEATDMF, ANALOG_SIG_SFWINK, analog_start(), ANALOG_SUB_CALLWAIT, ANALOG_SUB_REAL, ANALOG_TONE_RINGTONE, analog_pvt::answeronpolarityswitch, AST_CC_CCNR, AST_CC_GENERIC_MONITOR_TYPE, AST_CC_MONITOR_ALWAYS, AST_CC_MONITOR_GENERIC, AST_CC_MONITOR_NATIVE, AST_CC_MONITOR_NEVER, ast_channel_connected(), ast_channel_get_cc_config_params(), ast_channel_lock, ast_channel_name(), ast_channel_redirecting(), ast_channel_unlock, AST_CONTROL_BUSY, AST_CONTROL_RINGING, ast_copy_string(), ast_debug, ast_get_cc_monitor_policy(), ast_log, ast_queue_cc_frame(), ast_queue_control(), ast_setstate(), AST_STATE_BUSY, AST_STATE_DIALING, AST_STATE_DOWN, AST_STATE_RESERVED, AST_STATE_RINGING, ast_strlen_zero(), ast_true(), ast_tvnow(), c, analog_pvt::call_qualifier, analog_pvt::caller, analog_pvt::callwait_name, analog_pvt::callwait_num, ast_party_redirecting_reason::code, analog_pvt::dialdest, analog_pvt::dialednone, analog_dialoperation::dialstr, analog_pvt::dop, analog_pvt::echobreak, analog_pvt::echorest, analog_pvt::echotraining, errno, analog_pvt::finaldial, ast_party_redirecting::from, analog_pvt::hanguponpolarityswitch, ast_party_caller::id, ast_party_connected_line::id, analog_pvt::lastcid_name, analog_pvt::lastcid_num, LOG_WARNING, name, ast_party_id::name, NULL, ast_party_id::number, analog_dialoperation::op, analog_pvt::outsigmod, analog_subchannel::owner, analog_pvt::owner, pbx_builtin_getvar_helper(), analog_pvt::polaritydelaytv, ast_party_name::presentation, ast_party_number::presentation, analog_pvt::pulse, ast_party_redirecting::reason, analog_pvt::redirecting_reason, S_COR, analog_pvt::sig, ast_party_name::str, ast_party_number::str, analog_pvt::stripmsd, analog_pvt::subs, analog_pvt::use_callerid, ast_party_name::valid, ast_party_number::valid, and analog_pvt::whichwink.

Referenced by dahdi_call().

◆ analog_callwaiting_deluxe()

int analog_callwaiting_deluxe ( struct analog_pvt p,
int  option 
)

Definition at line 1635 of file sig_analog.c.

1636{
1637 const char *announce_var;
1638 char announcement[PATH_MAX];
1639
1640 ast_debug(1, "Handling Call Waiting on channel %d with option %c: treatment %s\n", p->channel, option, callwaiting_deluxe_optname(option));
1641
1642 if (!p->subs[ANALOG_SUB_CALLWAIT].owner) {
1643 /* This can happen if the caller hook flashes and the call waiting hangs up before the CWD timer expires (1 second) */
1644 ast_debug(1, "Call waiting call disappeared before it could be handled?\n");
1645 return -1;
1646 }
1647
1649 if (!p->subs[ANALOG_SUB_CALLWAIT].owner) {
1650 ast_log(LOG_WARNING, "Whoa, the call-waiting call disappeared.\n");
1651 return -1;
1652 }
1653
1654 /* Note that when p->callwaitingdeluxepending, dahdi_write will drop incoming frames to the channel,
1655 * since the user shouldn't hear anything after flashing until either a DTMF has been received
1656 * or it's been a second and the decision is made automatically. */
1657
1658 switch (option) {
1659 case CWD_CONFERENCE:
1660 /* We should never have a call waiting if we have a 3-way anyways, but check just in case,
1661 * there better be no existing SUB_THREEWAY since we're going to make one (and then swap the call wait to it) */
1662 if (p->subs[ANALOG_SUB_THREEWAY].owner) {
1664 ast_log(LOG_ERROR, "Already have a 3-way call on channel %d, can't conference!\n", p->channel);
1665 return -1;
1666 }
1667
1668 /* To conference the incoming call, swap it from SUB_CALLWAIT to SUB_THREEWAY,
1669 * and then the existing 3-way logic will ensure that flashing again will drop the call waiting */
1673
1674 ast_verb(3, "Building conference call with %s and %s\n", ast_channel_name(p->subs[ANALOG_SUB_THREEWAY].owner), ast_channel_name(p->subs[ANALOG_SUB_REAL].owner));
1677
1681 /* Stop the ringing on the call wait channel (yeah, apparently this is how it's done) */
1684 }
1686
1687 ast_channel_unlock(p->subs[ANALOG_SUB_THREEWAY].owner); /* Unlock what was originally SUB_CALLWAIT */
1688 break;
1689 case CWD_HOLD: /* The CI-7112 Visual Director sends "HOLD" for "Play hold message" rather than "ANNOUNCEMENT". For default behavior, nothing is actually sent. */
1690 case CWD_ANNOUNCEMENT:
1691 /* We can't just call ast_streamfile here, this thread isn't responsible for media on the call waiting channel.
1692 * Indicate to the dialing channel in app_dial that it needs to play media.
1693 *
1694 * This is a lot easier than other ways of trying to send early media to the channel
1695 * (such as every call from the core to dahdi_read, sending the channel one frame of the audio file, etc.)
1696 */
1697
1698 /* There's not a particularly good stock audio prompt to use here. The Pat Fleet library has some better
1699 * ones but we want one that is also in the default Allison Smith library. "One moment please" works okay.
1700 * Check if a variable containing the prompt to use was specified on the call waiting channel, and
1701 * fall back to a reasonable default if not. */
1702
1703 /* The SUB_CALLWAIT channel is already locked here, no need to lock and unlock to get the variable. */
1704 announce_var = pbx_builtin_getvar_helper(p->subs[ANALOG_SUB_CALLWAIT].owner, "CALLWAITDELUXEANNOUNCEMENT");
1705 ast_copy_string(announcement, S_OR(announce_var, "one-moment-please"), sizeof(announcement));
1706 ast_debug(2, "Call Waiting Deluxe announcement for %s: %s\n", ast_channel_name(p->subs[ANALOG_SUB_CALLWAIT].owner), announcement);
1708 /* Tell app_dial what file to play. */
1709 ast_queue_control_data(p->subs[ANALOG_SUB_CALLWAIT].owner, AST_CONTROL_PLAYBACK_BEGIN, announcement, strlen(announcement) + 1);
1710 /* Unlike all the other options, the call waiting is still active with this option,
1711 * so we don't call analog_stop_callwait(p)
1712 * The call waiting will continue to be here, and at some later point the user can flash again and choose a finalizing option
1713 * (or even queue the announcement again... and again... and again...)
1714 */
1715 break;
1716 case CWD_FORWARD:
1717 /* Go away, call waiting, call again some other day... */
1719 /* Can't use p->call_forward exten because that's for *72 forwarding, and sig_analog doesn't
1720 * have a Busy/Don't Answer call forwarding exten internally, so let the dialplan deal with it.
1721 * by sending the call to the 'f' extension.
1722 */
1723 ast_channel_call_forward_set(p->subs[ANALOG_SUB_CALLWAIT].owner, "f");
1725 /* app_dial already has a verbose message for forwarding, so we don't really need one here also since that does the job */
1726 break;
1727 case CWD_DROP:
1728 /* Fall through: logic is identical to hold, except we drop the original call right after we swap. */
1729 default:
1730 /* Swap to call-wait, same as with the non-deluxe call waiting handling. */
1734 ast_debug(1, "Making %s the new owner\n", ast_channel_name(p->owner));
1738 }
1740
1741 if (option == CWD_DROP) {
1742 /* Disconnect the previous call (the original call is now the SUB_CALLWAIT since we swapped above) */
1744 ast_verb(3, "Dropping original call and swapping to call waiting on %s\n", ast_channel_name(p->subs[ANALOG_SUB_REAL].owner));
1745 } else {
1746 /* Start music on hold if appropriate */
1749 }
1750 ast_verb(3, "Holding original call and swapping to call waiting on %s\n", ast_channel_name(p->subs[ANALOG_SUB_REAL].owner));
1751 }
1752
1753 /* Stop ringing on the incoming call */
1756
1757 /* Unlock the call-waiting call that we swapped to real-call. */
1759 }
1761 return 0;
1762}
#define PATH_MAX
Definition: asterisk.h:40
int ast_queue_hangup(struct ast_channel *chan)
Queue a hangup frame.
Definition: channel.c:1181
int ast_queue_control_data(struct ast_channel *chan, enum ast_control_frame_type control, const void *data, size_t datalen)
Queue a control frame with payload.
Definition: channel.c:1277
int ast_queue_unhold(struct ast_channel *chan)
Queue an unhold frame.
Definition: channel.c:1255
int ast_queue_hold(struct ast_channel *chan, const char *musicclass)
Queue a hold frame.
Definition: channel.c:1230
@ AST_CONTROL_PLAYBACK_BEGIN
@ AST_CONTROL_ANSWER
#define LOG_ERROR
#define ast_verb(level,...)
static int analog_alloc_sub(struct analog_pvt *p, enum analog_sub x)
Definition: sig_analog.c:368
static int analog_update_conf(struct analog_pvt *p)
Definition: sig_analog.c:749
@ CWD_DROP
Definition: sig_analog.c:1612
@ CWD_FORWARD
Definition: sig_analog.c:1614
@ CWD_HOLD
Definition: sig_analog.c:1611
@ CWD_CONFERENCE
Definition: sig_analog.c:1610
@ CWD_ANNOUNCEMENT
Definition: sig_analog.c:1613
static int analog_unalloc_sub(struct analog_pvt *p, enum analog_sub x)
Definition: sig_analog.c:381
static void analog_lock_sub_owner(struct analog_pvt *pvt, enum analog_sub sub_idx)
Definition: sig_analog.c:605
static int analog_stop_callwait(struct analog_pvt *p)
Definition: sig_analog.c:868
static void analog_set_inthreeway(struct analog_pvt *p, enum analog_sub sub, int inthreeway)
Definition: sig_analog.c:998
static const char * callwaiting_deluxe_optname(int option)
Definition: sig_analog.c:1617
#define S_OR(a, b)
returns the equivalent of logic or for strings: first one if not empty, otherwise second one.
Definition: strings.h:80
char mohsuggest[MAX_MUSICCLASS]
Definition: sig_analog.h:330

References analog_alloc_sub(), analog_lock_sub_owner(), analog_play_tone(), analog_set_inthreeway(), analog_set_new_owner(), analog_stop_callwait(), ANALOG_SUB_CALLWAIT, ANALOG_SUB_REAL, ANALOG_SUB_THREEWAY, analog_swap_subs(), analog_unalloc_sub(), analog_update_conf(), ast_channel_name(), ast_channel_unlock, AST_CONTROL_ANSWER, AST_CONTROL_PLAYBACK_BEGIN, ast_copy_string(), ast_debug, ast_log, ast_queue_control(), ast_queue_control_data(), ast_queue_hangup(), ast_queue_hold(), ast_queue_unhold(), ast_setstate(), AST_STATE_RINGING, AST_STATE_UP, ast_verb, callwaiting_deluxe_optname(), analog_pvt::channel, CWD_ANNOUNCEMENT, CWD_CONFERENCE, CWD_DROP, CWD_FORWARD, CWD_HOLD, analog_subchannel::inthreeway, LOG_ERROR, LOG_WARNING, analog_pvt::mohsuggest, analog_subchannel::owner, analog_pvt::owner, PATH_MAX, pbx_builtin_getvar_helper(), S_OR, and analog_pvt::subs.

Referenced by analog_handle_dtmf(), and dahdi_write().

◆ analog_cidstart_to_str()

const char * analog_cidstart_to_str ( enum analog_cid_start  cid_start)

Definition at line 249 of file sig_analog.c.

250{
251 switch (cid_start) {
253 return "Ring";
255 return "Polarity";
257 return "Polarity_In";
259 return "DTMF";
260 }
261
262 return "Unknown";
263}

References ANALOG_CID_START_DTMF_NOALERT, ANALOG_CID_START_POLARITY, ANALOG_CID_START_POLARITY_IN, and ANALOG_CID_START_RING.

◆ analog_cidtype_to_str()

const char * analog_cidtype_to_str ( unsigned int  cid_type)

Definition at line 149 of file sig_analog.c.

150{
151 int i;
152
153 for (i = 0; i < ARRAY_LEN(cidtypes); i++) {
154 if (cid_type == cidtypes[i].cid_type) {
155 return cidtypes[i].name;
156 }
157 }
158
159 return "Unknown";
160}
static const struct @145 cidtypes[]
unsigned int cid_type
Definition: sig_analog.c:96
#define ARRAY_LEN(a)
Definition: utils.h:703

References ARRAY_LEN, cid_type, and cidtypes.

◆ analog_config_complete()

int analog_config_complete ( struct analog_pvt p)

Definition at line 4393 of file sig_analog.c.

4394{
4395 /* No call waiting on non FXS channels */
4396 if ((p->sig != ANALOG_SIG_FXOKS) && (p->sig != ANALOG_SIG_FXOLS) && (p->sig != ANALOG_SIG_FXOGS)) {
4397 p->permcallwaiting = 0;
4398 }
4399
4401
4402 return 0;
4403}
static void analog_set_callwaiting(struct analog_pvt *p, int callwaiting_enable)
Definition: sig_analog.c:896
unsigned int permcallwaiting
Definition: sig_analog.h:301

References analog_set_callwaiting(), ANALOG_SIG_FXOGS, ANALOG_SIG_FXOKS, ANALOG_SIG_FXOLS, analog_pvt::permcallwaiting, and analog_pvt::sig.

Referenced by mkintf().

◆ analog_delete()

void analog_delete ( struct analog_pvt doomed)

Delete the analog private structure.

Since
1.8
Parameters
doomedAnalog private structure to delete.

Definition at line 4388 of file sig_analog.c.

4389{
4390 ast_free(doomed);
4391}
#define ast_free(a)
Definition: astmm.h:180

References ast_free.

Referenced by destroy_dahdi_pvt().

◆ analog_dnd()

int analog_dnd ( struct analog_pvt p,
int  flag 
)

Definition at line 4449 of file sig_analog.c.

4450{
4451 if (flag == -1) {
4452 return p->dnd;
4453 }
4454
4455 p->dnd = flag;
4456
4457 ast_verb(3, "%s DND on channel %d\n",
4458 flag ? "Enabled" : "Disabled",
4459 p->channel);
4460 analog_publish_dnd_state(p->channel, flag ? "enabled" : "disabled");
4461
4462 return 0;
4463}
long int flag
Definition: f2c.h:83
static void analog_publish_dnd_state(int channel, const char *status)
Definition: sig_analog.c:4429

References analog_publish_dnd_state(), ast_verb, analog_pvt::channel, and analog_pvt::dnd.

Referenced by __analog_ss_thread(), and dahdi_dnd().

◆ analog_exception()

struct ast_frame * analog_exception ( struct analog_pvt p,
struct ast_channel ast 
)

Definition at line 3956 of file sig_analog.c.

3957{
3958 int res;
3959 int idx;
3960 struct ast_frame *f;
3961
3962 ast_debug(1, "%s %d\n", __FUNCTION__, p->channel);
3963
3964 idx = analog_get_index(ast, p, 1);
3965 if (idx < 0) {
3966 idx = ANALOG_SUB_REAL;
3967 }
3968
3969 p->subs[idx].f.frametype = AST_FRAME_NULL;
3970 p->subs[idx].f.datalen = 0;
3971 p->subs[idx].f.samples = 0;
3972 p->subs[idx].f.mallocd = 0;
3973 p->subs[idx].f.offset = 0;
3974 p->subs[idx].f.subclass.integer = 0;
3975 p->subs[idx].f.delivery = ast_tv(0,0);
3976 p->subs[idx].f.src = "dahdi_exception";
3977 p->subs[idx].f.data.ptr = NULL;
3978
3979 if (!p->owner) {
3980 /* If nobody owns us, absorb the event appropriately, otherwise
3981 we loop indefinitely. This occurs when, during call waiting, the
3982 other end hangs up our channel so that it no longer exists, but we
3983 have neither FLASH'd nor ONHOOK'd to signify our desire to
3984 change to the other channel. */
3985 res = analog_get_event(p);
3986
3987 /* Switch to real if there is one and this isn't something really silly... */
3988 if ((res != ANALOG_EVENT_RINGEROFF) && (res != ANALOG_EVENT_RINGERON) &&
3989 (res != ANALOG_EVENT_HOOKCOMPLETE)) {
3990 ast_debug(1, "Restoring owner of channel %d on event %d\n", p->channel, res);
3992 if (p->owner && ast != p->owner) {
3993 /*
3994 * Could this even happen?
3995 * Possible deadlock because we do not have the real-call lock.
3996 */
3997 ast_log(LOG_WARNING, "Event %s on %s is not restored owner %s\n",
3999 }
4000 if (p->owner) {
4002 }
4003 }
4004 switch (res) {
4007 if (p->owner) {
4008 ast_verb(3, "Channel %s still has call, ringing phone\n", ast_channel_name(p->owner));
4009 analog_ring(p);
4011 } else {
4012 ast_log(LOG_WARNING, "Absorbed %s, but nobody is left!?!?\n",
4013 analog_event2str(res));
4014 }
4016 break;
4019 analog_off_hook(p);
4020 if (p->owner && (ast_channel_state(p->owner) == AST_STATE_RINGING)) {
4022 analog_set_dialing(p, 0);
4023 }
4024 break;
4028 /* Do nothing */
4029 break;
4031 gettimeofday(&p->flashtime, NULL);
4032 if (p->owner) {
4033 ast_verb(3, "Channel %d flashed to other channel %s\n", p->channel, ast_channel_name(p->owner));
4035 /* Answer if necessary */
4038 }
4041 } else {
4042 ast_log(LOG_WARNING, "Absorbed %s, but nobody is left!?!?\n",
4043 analog_event2str(res));
4044 }
4046 break;
4047 default:
4048 ast_log(LOG_WARNING, "Don't know how to absorb event %s\n", analog_event2str(res));
4049 break;
4050 }
4051 f = &p->subs[idx].f;
4052 return f;
4053 }
4054 ast_debug(1, "Exception on %d, channel %d\n", ast_channel_fd(ast, 0), p->channel);
4055 /* If it's not us, return NULL immediately */
4056 if (ast != p->owner) {
4057 ast_log(LOG_WARNING, "We're %s, not %s\n", ast_channel_name(ast), ast_channel_name(p->owner));
4058 f = &p->subs[idx].f;
4059 return f;
4060 }
4061
4062 f = __analog_handle_event(p, ast);
4063 if (!f) {
4064 const char *name = ast_strdupa(ast_channel_name(ast));
4065
4066 /* Tell the CDR this DAHDI device hung up */
4068 ast_channel_unlock(ast);
4069 ast_set_hangupsource(ast, name, 0);
4070 ast_channel_lock(ast);
4072 }
4073 return f;
4074}
#define ast_strdupa(s)
duplicate a string in memory from the stack
Definition: astmm.h:298
int ast_channel_fd(const struct ast_channel *chan, int which)
void ast_set_hangupsource(struct ast_channel *chan, const char *source, int force)
Set the source of the hangup in this channel and it's bridge.
Definition: channel.c:2469
@ AST_FRAME_NULL
static void analog_unlock_private(struct analog_pvt *p)
Definition: sig_analog.c:566
static struct ast_frame * __analog_handle_event(struct analog_pvt *p, struct ast_channel *ast)
Definition: sig_analog.c:3036
static char * analog_event2str(enum analog_event event)
Definition: sig_analog.c:265
static void analog_lock_private(struct analog_pvt *p)
Definition: sig_analog.c:573
static int analog_get_event(struct analog_pvt *p)
Definition: sig_analog.c:194
struct timeval flashtime
Definition: sig_analog.h:374
struct ast_frame f
Definition: sig_analog.h:265
Data structure associated with a single frame of data.
struct ast_frame_subclass subclass
struct timeval delivery
enum ast_frame_type frametype
union ast_frame::@231 data
const char * src
struct timeval ast_tv(ast_time_t sec, ast_suseconds_t usec)
Returns a timeval from sec, usec.
Definition: time.h:235

References __analog_handle_event(), analog_event2str(), ANALOG_EVENT_HOOKCOMPLETE, ANALOG_EVENT_ONHOOK, ANALOG_EVENT_RINGEROFF, ANALOG_EVENT_RINGERON, ANALOG_EVENT_RINGOFFHOOK, ANALOG_EVENT_WINKFLASH, analog_get_event(), analog_get_index, analog_lock_private(), analog_off_hook(), analog_ring(), analog_set_dialing(), analog_set_echocanceller(), analog_set_new_owner(), analog_stop_callwait(), ANALOG_SUB_REAL, analog_unlock_private(), analog_update_conf(), ast_channel_fd(), ast_channel_lock, ast_channel_name(), ast_channel_unlock, AST_CONTROL_ANSWER, ast_debug, AST_FRAME_NULL, ast_log, ast_queue_control(), ast_queue_unhold(), ast_set_hangupsource(), ast_setstate(), AST_STATE_RINGING, AST_STATE_UP, ast_strdupa, ast_tv(), ast_verb, analog_pvt::channel, ast_frame::data, ast_frame::datalen, ast_frame::delivery, analog_subchannel::f, analog_pvt::flashtime, ast_frame::frametype, ast_frame_subclass::integer, LOG_WARNING, ast_frame::mallocd, name, NULL, ast_frame::offset, analog_subchannel::owner, analog_pvt::owner, ast_frame::ptr, ast_frame::samples, ast_frame::src, ast_frame::subclass, and analog_pvt::subs.

Referenced by dahdi_exception(), and dahdi_read().

◆ analog_fixup()

int analog_fixup ( struct ast_channel oldchan,
struct ast_channel newchan,
void *  newp 
)

Definition at line 4411 of file sig_analog.c.

4412{
4413 struct analog_pvt *new_pvt = newp;
4414 int x;
4415 ast_debug(1, "New owner for channel %d is %s\n", new_pvt->channel, ast_channel_name(newchan));
4416 if (new_pvt->owner == oldchan) {
4417 analog_set_new_owner(new_pvt, newchan);
4418 }
4419 for (x = 0; x < 3; x++) {
4420 if (new_pvt->subs[x].owner == oldchan) {
4421 new_pvt->subs[x].owner = newchan;
4422 }
4423 }
4424
4425 analog_update_conf(new_pvt);
4426 return 0;
4427}

References analog_set_new_owner(), analog_update_conf(), ast_channel_name(), ast_debug, analog_pvt::channel, analog_subchannel::owner, analog_pvt::owner, and analog_pvt::subs.

Referenced by dahdi_fixup().

◆ analog_free()

void analog_free ( struct analog_pvt p)

Definition at line 4405 of file sig_analog.c.

4406{
4407 ast_free(p);
4408}

References ast_free.

◆ analog_handle_dtmf()

void analog_handle_dtmf ( struct analog_pvt p,
struct ast_channel ast,
enum analog_sub  index,
struct ast_frame **  dest 
)

Definition at line 1764 of file sig_analog.c.

1765{
1766 struct ast_frame *f = *dest;
1767
1768 ast_debug(1, "%s DTMF digit: 0x%02X '%c' on %s\n",
1769 f->frametype == AST_FRAME_DTMF_BEGIN ? "Begin" : "End",
1770 (unsigned)f->subclass.integer, f->subclass.integer, ast_channel_name(ast));
1771
1773 if (f->frametype == AST_FRAME_DTMF_END) {
1774 ast_debug(1, "Confirm answer on %s!\n", ast_channel_name(ast));
1775 /* Upon receiving a DTMF digit, consider this an answer confirmation instead
1776 of a DTMF digit */
1779 /* Reset confirmanswer so DTMF's will behave properly for the duration of the call */
1781 } else {
1782 p->subs[idx].f.frametype = AST_FRAME_NULL;
1783 p->subs[idx].f.subclass.integer = 0;
1784 }
1785 *dest = &p->subs[idx].f;
1786 } else if (p->callwaitcas) {
1787 if (f->frametype == AST_FRAME_DTMF_END) {
1788 if ((f->subclass.integer == 'A') || (f->subclass.integer == 'D')) {
1789 ast_debug(1, "Got some DTMF, but it's for the CAS\n");
1790 p->caller.id.name.str = p->callwait_name;
1792 analog_send_callerid(p, 1, &p->caller);
1793 }
1794 if (analog_handles_digit(f)) {
1795 p->callwaitcas = 0;
1796 }
1797 }
1798 p->subs[idx].f.frametype = AST_FRAME_NULL;
1799 p->subs[idx].f.subclass.integer = 0;
1800 *dest = &p->subs[idx].f;
1801 } else if (p->callwaitingdeluxepending) {
1802 if (f->frametype == AST_FRAME_DTMF_END) {
1803 unsigned int mssinceflash = ast_tvdiff_ms(ast_tvnow(), p->flashtime);
1805
1806 /* This is the case where a user explicitly took action (made a decision)
1807 * for Call Waiting Deluxe.
1808 * Because we already handled the hook flash, if the user doesn't do
1809 * anything within a second, then we still need to eventually take
1810 * the default action (swap) for the call waiting.
1811 *
1812 * dahdi_write will also drop audio if callwaitingdeluxepending is set HIGH,
1813 * and also check if flashtime hits 1000, in which case it will set the flag LOW and then take the
1814 * default action, e.g. analog_callwaiting_deluxe(p, 0);
1815 */
1816
1817 /* Slightly less than 1000, so there's no chance of a race condition
1818 * between do_monitor when it sees flashtime hitting 1000 and us. */
1819 if (mssinceflash > 990) {
1820 /* This was more than a second ago, clear the flag and process normally. */
1821 /* Because another thread has to monitor channels with pending CWDs,
1822 * in theory, we shouldn't need to check this here. */
1823 ast_debug(1, "It's been %u ms since the last flash, this is not a Call Waiting Deluxe DTMF\n", mssinceflash);
1824 analog_cb_handle_dtmf(p, ast, idx, dest);
1825 return;
1826 }
1827 /* Okay, actually do something now. */
1828 switch (f->subclass.integer) {
1829 case CWD_CONFERENCE:
1830 case CWD_HOLD:
1831 case CWD_DROP:
1832 case CWD_ANNOUNCEMENT:
1833 case CWD_FORWARD:
1834 ast_debug(1, "Got some DTMF, but it's for Call Waiting Deluxe: %c\n", f->subclass.integer);
1836 break;
1837 default:
1838 ast_log(LOG_WARNING, "Invalid Call Waiting Deluxe option (%c), using default\n", f->subclass.integer);
1840 }
1841 }
1842 p->subs[idx].f.frametype = AST_FRAME_NULL;
1843 p->subs[idx].f.subclass.integer = 0;
1844 *dest = &p->subs[idx].f;
1845 } else {
1846 analog_cb_handle_dtmf(p, ast, idx, dest);
1847 }
1848}
@ AST_FRAME_DTMF_END
@ AST_FRAME_DTMF_BEGIN
@ AST_FRAME_CONTROL
static int analog_send_callerid(struct analog_pvt *p, int cwcid, struct ast_party_caller *caller)
Definition: sig_analog.c:391
static void analog_set_confirmanswer(struct analog_pvt *p, int flag)
Definition: sig_analog.c:951
static void analog_cb_handle_dtmf(struct analog_pvt *p, struct ast_channel *ast, enum analog_sub analog_index, struct ast_frame **dest)
Definition: sig_analog.c:673
int analog_callwaiting_deluxe(struct analog_pvt *p, int option)
Definition: sig_analog.c:1635
static int analog_handles_digit(struct ast_frame *f)
Definition: sig_analog.c:1584
static int analog_check_confirmanswer(struct analog_pvt *p)
Definition: sig_analog.c:958
unsigned int callwaitingdeluxepending
TRUE if a Call Waiting Deluxe action is currently pending.
Definition: sig_analog.h:356
unsigned int callwaitcas
TRUE if Call Waiting (CW) CPE Alert Signal (CAS) is being sent.
Definition: sig_analog.h:351
int64_t ast_tvdiff_ms(struct timeval end, struct timeval start)
Computes the difference (in milliseconds) between two struct timeval instances.
Definition: time.h:107

References analog_callwaiting_deluxe(), analog_cb_handle_dtmf(), analog_check_confirmanswer(), analog_handles_digit(), analog_send_callerid(), analog_set_confirmanswer(), ast_channel_name(), AST_CONTROL_ANSWER, ast_debug, AST_FRAME_CONTROL, AST_FRAME_DTMF_BEGIN, AST_FRAME_DTMF_END, AST_FRAME_NULL, ast_log, ast_tvdiff_ms(), ast_tvnow(), analog_pvt::caller, analog_pvt::callwait_name, analog_pvt::callwait_num, analog_pvt::callwaitcas, analog_pvt::callwaitingdeluxepending, CWD_ANNOUNCEMENT, CWD_CONFERENCE, CWD_DROP, CWD_FORWARD, CWD_HOLD, analog_subchannel::f, analog_pvt::flashtime, ast_frame::frametype, ast_party_caller::id, ast_frame_subclass::integer, LOG_WARNING, ast_party_id::name, ast_party_id::number, ast_party_name::str, ast_party_number::str, ast_frame::subclass, and analog_pvt::subs.

Referenced by __analog_handle_event(), and dahdi_read().

◆ analog_handle_init_event()

void * analog_handle_init_event ( struct analog_pvt i,
int  event 
)

Definition at line 4076 of file sig_analog.c.

4077{
4078 int res;
4079 pthread_t threadid;
4080 struct ast_channel *chan;
4081 ast_callid callid = 0;
4082 int callid_created;
4083
4084 ast_debug(1, "channel (%d) - signaling (%d) - event (%s)\n",
4086
4087 /* Handle an event on a given channel for the monitor thread. */
4088 switch (event) {
4091 switch (i->sig) {
4092 case ANALOG_SIG_FXSLS:
4093 case ANALOG_SIG_FXSGS:
4094 case ANALOG_SIG_FXSKS:
4095 if (i->immediate) {
4097 ast_log(LOG_WARNING, "Can't start PBX immediately, must wait for Caller ID / distinctive ring\n");
4098 } else {
4099 /* If we don't care about Caller ID or Distinctive Ring, then there's
4100 * no need to wait for anything before accepting the call, as
4101 * waiting will buy us nothing.
4102 * So if the channel is configured for immediate, actually start immediately
4103 * and get the show on the road as soon as possible. */
4104 ast_debug(1, "Disabling ring timeout (previously %d) to begin handling immediately\n", i->ringt_base);
4106 }
4107 }
4108 break;
4109 default:
4110 break;
4111 }
4112 /* Fall through */
4113 if (!(ISTRUNK(i) && i->immediate && !i->use_callerid && !i->usedistinctiveringdetection)) {
4114 break;
4115 }
4117 if (i->inalarm) {
4118 break;
4119 }
4120 /* Got a ring/answer. What kind of channel are we? */
4121 switch (i->sig) {
4122 case ANALOG_SIG_FXOLS:
4123 case ANALOG_SIG_FXOGS:
4124 case ANALOG_SIG_FXOKS:
4125 res = analog_off_hook(i);
4126 i->fxsoffhookstate = 1;
4127 i->cshactive = 0;
4129 if (res && (errno == EBUSY)) {
4130 break;
4131 }
4132 callid_created = ast_callid_threadstorage_auto(&callid);
4133
4134 /* Cancel VMWI spill */
4136
4137 if (i->immediate) {
4139 /* The channel is immediately up. Start right away */
4140 if (i->immediatering) {
4141 /* Play fake ringing, if we've been told to... */
4143 }
4145 if (!chan) {
4146 ast_log(LOG_WARNING, "Unable to start PBX on channel %d\n", i->channel);
4148 if (res < 0) {
4149 ast_log(LOG_WARNING, "Unable to play congestion tone on channel %d\n", i->channel);
4150 }
4151 }
4152 } else {
4153 /* Check for callerid, digits, etc */
4155 i->ss_astchan = chan;
4156 if (chan) {
4157 if (analog_has_voicemail(i)) {
4159 } else {
4161 }
4162 if (res < 0)
4163 ast_log(LOG_WARNING, "Unable to play dialtone on channel %d, do you have defaultzone and loadzone defined?\n", i->channel);
4164
4166 ast_log(LOG_WARNING, "Unable to start simple switch thread on channel %d\n", i->channel);
4168 if (res < 0) {
4169 ast_log(LOG_WARNING, "Unable to play congestion tone on channel %d\n", i->channel);
4170 }
4171 ast_hangup(chan);
4172 }
4173 } else
4174 ast_log(LOG_WARNING, "Unable to create channel\n");
4175 }
4177 break;
4178 case ANALOG_SIG_FXSLS:
4179 case ANALOG_SIG_FXSGS:
4180 case ANALOG_SIG_FXSKS:
4182 /* Fall through */
4183 case ANALOG_SIG_EMWINK:
4184 case ANALOG_SIG_FEATD:
4185 case ANALOG_SIG_FEATDMF:
4187 case ANALOG_SIG_E911:
4190 case ANALOG_SIG_FEATB:
4191 case ANALOG_SIG_EM:
4192 case ANALOG_SIG_EM_E1:
4193 case ANALOG_SIG_SFWINK:
4197 case ANALOG_SIG_SF:
4198 callid_created = ast_callid_threadstorage_auto(&callid);
4199 /* Check for callerid, digits, etc */
4202 } else {
4204 }
4205 i->ss_astchan = chan;
4206 if (!chan) {
4207 ast_log(LOG_WARNING, "Cannot allocate new structure on channel %d\n", i->channel);
4208 } else if (ast_pthread_create_detached(&threadid, NULL, __analog_ss_thread, i)) {
4209 ast_log(LOG_WARNING, "Unable to start simple switch thread on channel %d\n", i->channel);
4211 if (res < 0) {
4212 ast_log(LOG_WARNING, "Unable to play congestion tone on channel %d\n", i->channel);
4213 }
4214 ast_hangup(chan);
4215 }
4217 break;
4218 default:
4219 ast_log(LOG_WARNING, "Don't know how to handle ring/answer with signalling %s on channel %d\n", analog_sigtype_to_str(i->sig), i->channel);
4221 if (res < 0) {
4222 ast_log(LOG_WARNING, "Unable to play congestion tone on channel %d\n", i->channel);
4223 }
4224 return NULL;
4225 }
4226 break;
4228 analog_set_alarm(i, 0);
4230 break;
4231 case ANALOG_EVENT_ALARM:
4232 analog_set_alarm(i, 1);
4234 /* fall thru intentionally */
4236 /* Back on hook. Hang up. */
4237 switch (i->sig) {
4238 case ANALOG_SIG_FXOLS:
4239 case ANALOG_SIG_FXOGS:
4240 i->fxsoffhookstate = 0;
4242 /* Fall through */
4243 case ANALOG_SIG_FEATD:
4244 case ANALOG_SIG_FEATDMF:
4246 case ANALOG_SIG_E911:
4249 case ANALOG_SIG_FEATB:
4250 case ANALOG_SIG_EM:
4251 case ANALOG_SIG_EM_E1:
4252 case ANALOG_SIG_EMWINK:
4256 case ANALOG_SIG_SF:
4257 case ANALOG_SIG_SFWINK:
4258 case ANALOG_SIG_FXSLS:
4259 case ANALOG_SIG_FXSGS:
4260 case ANALOG_SIG_FXSKS:
4262 res = analog_play_tone(i, ANALOG_SUB_REAL, -1);
4263 analog_on_hook(i);
4264 break;
4265 case ANALOG_SIG_FXOKS:
4266 i->fxsoffhookstate = 0;
4269 /* Diddle the battery for the zhone */
4270#ifdef ZHONE_HACK
4271 analog_off_hook(i);
4272 usleep(1);
4273#endif
4274 res = analog_play_tone(i, ANALOG_SUB_REAL, -1);
4275 analog_on_hook(i);
4276 break;
4277 default:
4278 ast_log(LOG_WARNING, "Don't know how to handle on hook with signalling %s on channel %d\n", analog_sigtype_to_str(i->sig), i->channel);
4279 res = analog_play_tone(i, ANALOG_SUB_REAL, -1);
4280 return NULL;
4281 }
4282 break;
4284 switch (i->sig) {
4285 case ANALOG_SIG_FXSLS:
4286 case ANALOG_SIG_FXSKS:
4287 case ANALOG_SIG_FXSGS:
4288 callid_created = ast_callid_threadstorage_auto(&callid);
4289 /* We have already got a PR before the channel was
4290 created, but it wasn't handled. We need polarity
4291 to be REV for remote hangup detection to work.
4292 At least in Spain */
4293 if (i->hanguponpolarityswitch) {
4295 }
4298 ast_verb(2, "Starting post polarity CID detection on channel %d\n",
4299 i->channel);
4301 i->ss_astchan = chan;
4302 if (!chan) {
4303 ast_log(LOG_WARNING, "Cannot allocate new structure on channel %d\n", i->channel);
4304 } else if (ast_pthread_create_detached(&threadid, NULL, __analog_ss_thread, i)) {
4305 ast_log(LOG_WARNING, "Unable to start simple switch thread on channel %d\n", i->channel);
4306 ast_hangup(chan);
4307 }
4308 }
4310 break;
4311 default:
4313 "handle_init_event detected polarity reversal on non-FXO (ANALOG_SIG_FXS) interface %d\n",
4314 i->channel);
4315 break;
4316 }
4317 break;
4319 switch (i->sig) {
4320 case ANALOG_SIG_FXSLS:
4321 case ANALOG_SIG_FXSKS:
4322 case ANALOG_SIG_FXSGS:
4323 callid_created = ast_callid_threadstorage_auto(&callid);
4325 ast_verb(2, "Starting DTMF CID detection on channel %d\n",
4326 i->channel);
4328 i->ss_astchan = chan;
4329 if (!chan) {
4330 ast_log(LOG_WARNING, "Cannot allocate new structure on channel %d\n", i->channel);
4331 } else if (ast_pthread_create_detached(&threadid, NULL, __analog_ss_thread, i)) {
4332 ast_log(LOG_WARNING, "Unable to start simple switch thread on channel %d\n", i->channel);
4333 ast_hangup(chan);
4334 }
4335 }
4337 break;
4338 default:
4340 "handle_init_event detected dtmfcid generation event on non-FXO (ANALOG_SIG_FXS) interface %d\n",
4341 i->channel);
4342 break;
4343 }
4344 break;
4345 case ANALOG_EVENT_REMOVED: /* destroy channel, will actually do so in do_monitor */
4346 ast_log(LOG_NOTICE, "Got ANALOG_EVENT_REMOVED. Destroying channel %d\n",
4347 i->channel);
4348 return i->chan_pvt;
4351 break;
4354 break;
4355 }
4356 return NULL;
4357}
void ast_hangup(struct ast_channel *chan)
Hang up a channel.
Definition: channel.c:2511
@ AST_STATE_RING
Definition: channelstate.h:40
@ AST_STATE_PRERING
Definition: channelstate.h:45
void ast_callid_threadstorage_auto_clean(ast_callid callid, int callid_created)
Use in conjunction with ast_callid_threadstorage_auto. Cleans up the references and if the callid was...
Definition: logger.c:2348
unsigned int ast_callid
int ast_callid_threadstorage_auto(ast_callid *callid)
Checks thread storage for a callid and stores a reference if it exists. If not, then a new one will b...
Definition: logger.c:2326
#define LOG_NOTICE
static void analog_publish_channel_alarm_clear(int channel)
Definition: sig_analog.c:3023
static void analog_set_alarm(struct analog_pvt *p, int in_alarm)
Definition: sig_analog.c:919
static int analog_handle_notify_message(struct ast_channel *chan, struct analog_pvt *p, int cid_flags, int neon_mwievent)
Definition: sig_analog.c:1870
static struct ast_channel * analog_new_ast_channel(struct analog_pvt *p, int state, int startpbx, enum analog_sub sub, const struct ast_channel *requestor)
Definition: sig_analog.c:460
static void * __analog_ss_thread(void *data)
Definition: sig_analog.c:1958
static void analog_get_and_handle_alarms(struct analog_pvt *p)
Definition: sig_analog.c:1905
static int analog_has_voicemail(struct analog_pvt *p)
Definition: sig_analog.c:688
#define ISTRUNK(p)
Definition: sig_analog.c:107
const char * analog_sigtype_to_str(enum analog_sigtype sigtype)
Definition: sig_analog.c:123
static void analog_cancel_cidspill(struct analog_pvt *p)
Definition: sig_analog.c:967
#define POLARITY_REV
Definition: sig_analog.c:63
static void analog_start_polarityswitch(struct analog_pvt *p)
Definition: sig_analog.c:645
unsigned int immediate
Definition: sig_analog.h:298
unsigned int immediatering
Definition: sig_analog.h:299
void * chan_pvt
Definition: sig_analog.h:275
unsigned int usedistinctiveringdetection
Definition: sig_analog.h:311
enum analog_cid_start cid_start
Definition: sig_analog.h:329
int ringt_base
Definition: sig_analog.h:386
int fxsoffhookstate
Definition: sig_analog.h:282
unsigned int inalarm
Definition: sig_analog.h:344
int polarity
Definition: sig_analog.h:370
struct ast_channel * ss_astchan
Definition: sig_analog.h:382
Main Channel structure associated with a channel.
ast_callid callid
Definition: astman.c:222
#define ast_pthread_create_detached(a, b, c, d)
Definition: utils.h:625

References __analog_ss_thread(), analog_cancel_cidspill(), ANALOG_CID_START_DTMF_NOALERT, ANALOG_CID_START_POLARITY, ANALOG_CID_START_POLARITY_IN, analog_event2str(), ANALOG_EVENT_ALARM, ANALOG_EVENT_DTMFCID, ANALOG_EVENT_NEONMWI_ACTIVE, ANALOG_EVENT_NEONMWI_INACTIVE, ANALOG_EVENT_NOALARM, ANALOG_EVENT_ONHOOK, ANALOG_EVENT_POLARITY, ANALOG_EVENT_REMOVED, ANALOG_EVENT_RINGBEGIN, ANALOG_EVENT_RINGOFFHOOK, ANALOG_EVENT_WINKFLASH, analog_get_and_handle_alarms(), analog_handle_notify_message(), analog_has_voicemail(), analog_new_ast_channel(), analog_off_hook(), analog_on_hook(), analog_play_tone(), analog_publish_channel_alarm_clear(), analog_set_alarm(), analog_set_echocanceller(), analog_set_ringtimeout(), ANALOG_SIG_E911, ANALOG_SIG_EM, ANALOG_SIG_EM_E1, ANALOG_SIG_EMWINK, ANALOG_SIG_FEATB, ANALOG_SIG_FEATD, ANALOG_SIG_FEATDMF, ANALOG_SIG_FEATDMF_TA, ANALOG_SIG_FGC_CAMA, ANALOG_SIG_FGC_CAMAMF, ANALOG_SIG_FXOGS, ANALOG_SIG_FXOKS, ANALOG_SIG_FXOLS, ANALOG_SIG_FXSGS, ANALOG_SIG_FXSKS, ANALOG_SIG_FXSLS, ANALOG_SIG_SF, ANALOG_SIG_SF_FEATB, ANALOG_SIG_SF_FEATD, ANALOG_SIG_SF_FEATDMF, ANALOG_SIG_SFWINK, analog_sigtype_to_str(), analog_start_polarityswitch(), ANALOG_SUB_REAL, ANALOG_TONE_CONGESTION, ANALOG_TONE_DIALTONE, ANALOG_TONE_RINGTONE, ANALOG_TONE_STUTTER, ast_callid_threadstorage_auto(), ast_callid_threadstorage_auto_clean(), ast_debug, ast_hangup(), ast_log, ast_pthread_create_detached, AST_STATE_PRERING, AST_STATE_RESERVED, AST_STATE_RING, ast_verb, ast_channel::callid, analog_pvt::callwaitingdeluxepending, analog_pvt::chan_pvt, analog_pvt::channel, analog_pvt::cid_start, analog_pvt::cshactive, errno, analog_pvt::fxsoffhookstate, analog_pvt::hanguponpolarityswitch, analog_pvt::immediate, analog_pvt::immediatering, analog_pvt::inalarm, ISTRUNK, LOG_NOTICE, LOG_WARNING, NULL, analog_pvt::polarity, POLARITY_REV, analog_pvt::ringt_base, analog_pvt::sig, analog_pvt::ss_astchan, analog_pvt::use_callerid, and analog_pvt::usedistinctiveringdetection.

Referenced by do_monitor().

◆ analog_hangup()

int analog_hangup ( struct analog_pvt p,
struct ast_channel ast 
)

Definition at line 1293 of file sig_analog.c.

1294{
1295 int res;
1296 int idx, x;
1297
1298 ast_debug(1, "%s %d\n", __FUNCTION__, p->channel);
1299 if (!ast_channel_tech_pvt(ast)) {
1300 ast_log(LOG_WARNING, "Asked to hangup channel not connected\n");
1301 return 0;
1302 }
1303
1304 idx = analog_get_index(ast, p, 1);
1305
1306 x = 0;
1307 if (p->origcid_num) {
1308 ast_copy_string(p->cid_num, p->origcid_num, sizeof(p->cid_num));
1310 p->origcid_num = NULL;
1311 }
1312 if (p->origcid_name) {
1313 ast_copy_string(p->cid_name, p->origcid_name, sizeof(p->cid_name));
1315 p->origcid_name = NULL;
1316 }
1317
1319
1320 ast_debug(1, "Hangup: channel: %d index = %d, normal = %d, callwait = %d, thirdcall = %d\n",
1322 if (idx > -1) {
1323 /* Real channel, do some fixup */
1324 p->cshactive = 0;
1325 p->subs[idx].owner = NULL;
1327 analog_set_linear_mode(p, idx, 0);
1328 switch (idx) {
1329 case ANALOG_SUB_REAL:
1331 ast_debug(1, "Normal call hung up with both three way call and a call waiting call in place?\n");
1333 /* We had flipped over to answer a callwait and now it's gone */
1334 ast_debug(1, "We were flipped over to the callwait, moving back and not owning.\n");
1335 /* Move to the call-wait, but un-own us until they flip back. */
1339 } else {
1340 /* The three way hung up, but we still have a call wait */
1341 ast_debug(1, "We were in the threeway and have a callwait still. Ditching the threeway.\n");
1345 /* This was part of a three way call. Immediately make way for
1346 another call */
1347 ast_debug(1, "Call was complete, setting owner to former third call\n");
1350 } else {
1351 /* This call hasn't been completed yet... Set owner to NULL */
1352 ast_debug(1, "Call was incomplete, setting owner to NULL\n");
1354 }
1355 }
1356 } else if (p->subs[ANALOG_SUB_CALLWAIT].allocd) {
1357 /* Need to hold the lock for real-call, private, and call-waiting call */
1359 if (!p->subs[ANALOG_SUB_CALLWAIT].owner) {
1360 /* The call waiting call disappeared. */
1362 break;
1363 }
1364
1365 /* Move to the call-wait and switch back to them. */
1371 }
1373 /* Unlock the call-waiting call that we swapped to real-call. */
1375 } else if (p->subs[ANALOG_SUB_THREEWAY].allocd) {
1379 /* This was part of a three way call. Immediately make way for
1380 another call */
1381 ast_debug(1, "Call was complete, setting owner to former third call\n");
1384 } else {
1385 /* This call hasn't been completed yet... Set owner to NULL */
1386 ast_debug(1, "Call was incomplete, setting owner to NULL\n");
1388 }
1389 }
1390 break;
1392 /* Ditch the holding callwait call, and immediately make it available */
1394 /* Need to hold the lock for call-waiting call, private, and 3-way call */
1396
1397 /* This is actually part of a three way, placed on hold. Place the third part
1398 on music on hold now */
1399 if (p->subs[ANALOG_SUB_THREEWAY].owner) {
1401 }
1403 /* Make it the call wait now */
1406 if (p->subs[ANALOG_SUB_CALLWAIT].owner) {
1407 /* Unlock the 3-way call that we swapped to call-waiting call. */
1409 }
1410 } else {
1412 }
1413 break;
1415 /* Need to hold the lock for 3-way call, private, and call-waiting call */
1418 /* The other party of the three way call is currently in a call-wait state.
1419 Start music on hold for them, and take the main guy out of the third call */
1421 if (p->subs[ANALOG_SUB_CALLWAIT].owner) {
1423 }
1424 }
1425 if (p->subs[ANALOG_SUB_CALLWAIT].owner) {
1427 }
1429 /* If this was part of a three way call index, let us make
1430 another three way call */
1432 break;
1433 default:
1434 /*
1435 * Should never happen.
1436 * This wasn't any sort of call, so how are we an index?
1437 */
1438 ast_log(LOG_ERROR, "Index found but not any type of call?\n");
1439 break;
1440 }
1441 }
1442
1448 analog_set_outgoing(p, 0);
1449 p->onhooktime = time(NULL);
1450 p->cidrings = 1;
1451
1452 /* Perform low level hangup if no owner left */
1453 res = analog_on_hook(p);
1454 if (res < 0) {
1455 ast_log(LOG_WARNING, "Unable to hangup line %s\n", ast_channel_name(ast));
1456 }
1457 switch (p->sig) {
1458 case ANALOG_SIG_FXOGS:
1459 case ANALOG_SIG_FXOLS:
1460 case ANALOG_SIG_FXOKS:
1461 /* If they're off hook, try playing congestion */
1462 if (analog_is_off_hook(p)) {
1465 } else {
1467 }
1468 break;
1469 case ANALOG_SIG_FXSGS:
1470 case ANALOG_SIG_FXSLS:
1471 case ANALOG_SIG_FXSKS:
1472 /* Make sure we're not made available for at least two seconds assuming
1473 we were actually used for an inbound or outbound call. */
1475 time(&p->guardtime);
1476 p->guardtime += 2;
1477 }
1478 break;
1479 default:
1481 break;
1482 }
1483
1485
1486 x = 0;
1487 ast_channel_setoption(ast,AST_OPTION_TONE_VERIFY,&x,sizeof(char),0);
1488 ast_channel_setoption(ast,AST_OPTION_TDD,&x,sizeof(char),0);
1489 p->callwaitcas = 0;
1491 /* In theory, the below is not necessary since we set hidecallerid = permhidecaller when calls start,
1492 * but this ensures the setting is defaulted properly when channels are idle, too. */
1494 analog_set_dialing(p, 0);
1497 }
1498
1500
1501 ast_verb(3, "Hanging up on '%s'\n", ast_channel_name(ast));
1502
1503 return 0;
1504}
void * ast_channel_tech_pvt(const struct ast_channel *chan)
int ast_channel_setoption(struct ast_channel *channel, int option, void *data, int datalen, int block)
Sets an option on a channel.
Definition: channel.c:7404
#define AST_OPTION_TONE_VERIFY
#define AST_OPTION_TDD
static int analog_set_linear_mode(struct analog_pvt *p, enum analog_sub sub, int linear_mode)
Definition: sig_analog.c:989
static void analog_hangup_polarityswitch(struct analog_pvt *p)
Definition: sig_analog.c:658
static int analog_dsp_set_digitmode(struct analog_pvt *p, enum analog_dsp_digitmode mode)
Definition: sig_analog.c:665
static void analog_set_pulsedial(struct analog_pvt *p, int flag)
Definition: sig_analog.c:982
#define POLARITY_IDLE
Definition: sig_analog.c:62
static void analog_all_subchannels_hungup(struct analog_pvt *p)
Definition: sig_analog.c:559
char cid_num[AST_MAX_EXTENSION]
Definition: sig_analog.h:331
unsigned int permhidecallerid
Definition: sig_analog.h:303
char * origcid_name
Definition: sig_analog.h:378
char * origcid_num
Definition: sig_analog.h:377
int onhooktime
Definition: sig_analog.h:281
int cidrings
Definition: sig_analog.h:368
unsigned int hidecallerid
Definition: sig_analog.h:342
char cid_name[AST_MAX_EXTENSION]
Definition: sig_analog.h:332

References analog_subchannel::allocd, analog_all_subchannels_hungup(), ANALOG_DIGITMODE_DTMF, analog_dsp_set_digitmode(), analog_get_index, analog_hangup_polarityswitch(), analog_is_off_hook(), analog_lock_sub_owner(), analog_on_hook(), analog_play_tone(), analog_set_callwaiting(), analog_set_confirmanswer(), analog_set_dialing(), analog_set_echocanceller(), analog_set_inthreeway(), analog_set_linear_mode(), analog_set_new_owner(), analog_set_outgoing(), analog_set_pulsedial(), analog_set_ringtimeout(), ANALOG_SIG_FXOGS, ANALOG_SIG_FXOKS, ANALOG_SIG_FXOLS, ANALOG_SIG_FXSGS, ANALOG_SIG_FXSKS, ANALOG_SIG_FXSLS, analog_stop_callwait(), ANALOG_SUB_CALLWAIT, ANALOG_SUB_REAL, ANALOG_SUB_THREEWAY, analog_swap_subs(), ANALOG_TONE_CONGESTION, analog_unalloc_sub(), analog_update_conf(), ast_channel_name(), ast_channel_setoption(), ast_channel_tech_pvt(), ast_channel_unlock, AST_CONTROL_ANSWER, ast_copy_string(), ast_debug, ast_free, ast_log, AST_OPTION_TDD, AST_OPTION_TONE_VERIFY, ast_queue_control(), ast_queue_hold(), ast_queue_unhold(), AST_STATE_RESERVED, AST_STATE_UP, ast_verb, analog_pvt::callwaitcas, analog_pvt::channel, analog_pvt::cid_name, analog_pvt::cid_num, analog_pvt::cidrings, analog_pvt::cshactive, analog_pvt::guardtime, analog_pvt::hidecallerid, analog_subchannel::inthreeway, LOG_ERROR, LOG_WARNING, analog_pvt::mohsuggest, NULL, analog_pvt::onhooktime, analog_pvt::origcid_name, analog_pvt::origcid_num, analog_subchannel::owner, analog_pvt::owner, analog_pvt::permcallwaiting, analog_pvt::permhidecallerid, analog_pvt::polarity, POLARITY_IDLE, analog_pvt::sig, and analog_pvt::subs.

Referenced by dahdi_hangup().

◆ analog_new()

struct analog_pvt * analog_new ( enum analog_sigtype  signallingtype,
void *  private_data 
)

Definition at line 4360 of file sig_analog.c.

4361{
4362 struct analog_pvt *p;
4363
4364 p = ast_calloc(1, sizeof(*p));
4365 if (!p) {
4366 return p;
4367 }
4368
4370 p->sig = signallingtype;
4371 p->chan_pvt = private_data;
4372
4373 /* Some defaults for values */
4376 /* Sub real is assumed to always be alloc'd */
4377 p->subs[ANALOG_SUB_REAL].allocd = 1;
4378
4379 return p;
4380}
#define ast_calloc(num, len)
A wrapper for calloc()
Definition: astmm.h:202
#define CID_SIG_BELL
Definition: callerid.h:60
int cid_signalling
Definition: sig_analog.h:326

References analog_subchannel::allocd, ANALOG_CID_START_RING, ANALOG_SIG_NONE, ANALOG_SUB_REAL, ast_calloc, analog_pvt::chan_pvt, CID_SIG_BELL, analog_pvt::cid_signalling, analog_pvt::cid_start, analog_pvt::outsigmod, analog_pvt::sig, and analog_pvt::subs.

Referenced by mkintf().

◆ analog_request()

struct ast_channel * analog_request ( struct analog_pvt p,
int *  callwait,
const struct ast_channel requestor 
)

Definition at line 776 of file sig_analog.c.

777{
778 struct ast_channel *ast;
779
780 ast_debug(1, "%s %d\n", __FUNCTION__, p->channel);
781 *callwait = (p->owner != NULL);
782
783 if (p->owner) {
785 ast_log(LOG_ERROR, "Unable to alloc subchannel\n");
786 return NULL;
787 }
788 }
789
792 p->owner ? ANALOG_SUB_CALLWAIT : ANALOG_SUB_REAL, requestor);
793 if (!ast) {
795 }
796 return ast;
797}

References analog_alloc_sub(), analog_new_ast_channel(), analog_set_outgoing(), ANALOG_SUB_CALLWAIT, ANALOG_SUB_REAL, ast_debug, ast_log, AST_STATE_RESERVED, analog_pvt::channel, LOG_ERROR, NULL, and analog_pvt::owner.

Referenced by dahdi_request().

◆ analog_sigtype_to_str()

const char * analog_sigtype_to_str ( enum analog_sigtype  sigtype)

Definition at line 123 of file sig_analog.c.

124{
125 int i;
126
127 for (i = 0; i < ARRAY_LEN(sigtypes); i++) {
128 if (sigtype == sigtypes[i].sigtype) {
129 return sigtypes[i].name;
130 }
131 }
132
133 return "Unknown";
134}
static const struct @144 sigtypes[]
enum analog_sigtype sigtype
Definition: sig_analog.c:69

References ARRAY_LEN, sigtype, and sigtypes.

Referenced by __analog_ss_thread(), and analog_handle_init_event().

◆ analog_ss_thread_start()

int analog_ss_thread_start ( struct analog_pvt p,
struct ast_channel ast 
)

Definition at line 3015 of file sig_analog.c.

3016{
3017 pthread_t threadid;
3018
3019 p->ss_astchan = chan;
3021}

References __analog_ss_thread(), ast_pthread_create_detached, NULL, and analog_pvt::ss_astchan.

Referenced by mwi_thread().

◆ analog_str_to_cidstart()

enum analog_cid_start analog_str_to_cidstart ( const char *  value)

Definition at line 234 of file sig_analog.c.

235{
236 if (!strcasecmp(value, "ring")) {
238 } else if (!strcasecmp(value, "polarity")) {
240 } else if (!strcasecmp(value, "polarity_in")) {
242 } else if (!strcasecmp(value, "dtmf")) {
244 }
245
246 return 0;
247}
int value
Definition: syslog.c:37

References ANALOG_CID_START_DTMF_NOALERT, ANALOG_CID_START_POLARITY, ANALOG_CID_START_POLARITY_IN, ANALOG_CID_START_RING, and value.

◆ analog_str_to_cidtype()

unsigned int analog_str_to_cidtype ( const char *  name)

Definition at line 136 of file sig_analog.c.

137{
138 int i;
139
140 for (i = 0; i < ARRAY_LEN(cidtypes); i++) {
141 if (!strcasecmp(cidtypes[i].name, name)) {
142 return cidtypes[i].cid_type;
143 }
144 }
145
146 return 0;
147}

References ARRAY_LEN, cidtypes, and name.

◆ analog_str_to_sigtype()

enum analog_sigtype analog_str_to_sigtype ( const char *  name)

Definition at line 110 of file sig_analog.c.

111{
112 int i;
113
114 for (i = 0; i < ARRAY_LEN(sigtypes); i++) {
115 if (!strcasecmp(sigtypes[i].name, name)) {
116 return sigtypes[i].sigtype;
117 }
118 }
119
120 return 0;
121}

References ARRAY_LEN, name, and sigtypes.

Variable Documentation

◆ analog_callbacks

struct analog_callback analog_callbacks
extern

Global analog callbacks to the upper layer.

Definition at line 3691 of file chan_dahdi.c.

Referenced by analog_all_subchannels_hungup(), analog_alloc_sub(), analog_answer_polarityswitch(), analog_callwait(), analog_cancel_cidspill(), analog_cb_handle_dtmf(), analog_check_confirmanswer(), analog_check_for_conference(), analog_check_waitingfordt(), analog_confmute(), analog_deadlock_avoidance_private(), analog_decrease_ss_count(), analog_dial_digits(), analog_distinctive_ring(), analog_dsp_reset_and_flush_digits(), analog_dsp_set_digitmode(), analog_flash(), analog_get_and_handle_alarms(), analog_get_bridged_channel(), analog_get_callerid(), analog_get_event(), analog_get_orig_dialstring(), analog_get_sub_fd(), analog_handle_notify_message(), analog_hangup_polarityswitch(), analog_has_voicemail(), analog_have_progressdetect(), analog_increase_ss_count(), analog_is_dialing(), analog_is_off_hook(), analog_lock_private(), analog_new_ast_channel(), analog_off_hook(), analog_on_hook(), analog_play_tone(), analog_ring(), analog_send_callerid(), analog_set_alarm(), analog_set_cadence(), analog_set_callwaiting(), analog_set_confirmanswer(), analog_set_dialing(), analog_set_echocanceller(), analog_set_inthreeway(), analog_set_linear_mode(), analog_set_needringing(), analog_set_new_owner(), analog_set_outgoing(), analog_set_pulsedial(), analog_set_ringtimeout(), analog_set_waitingfordt(), analog_start(), analog_start_cid_detect(), analog_start_polarityswitch(), analog_stop_callwait(), analog_stop_cid_detect(), analog_swap_subs(), analog_train_echocanceller(), analog_unalloc_sub(), analog_unlock_private(), analog_update_conf(), analog_wait_event(), and analog_wink().