Asterisk - The Open Source Telephony Project GIT-master-b023714
Loading...
Searching...
No Matches
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.
 
#define ANALOG_INTER_DIGIT_TIMEOUT   8000
 Default time (ms) to detect following digits.
 
#define ANALOG_MATCH_DIGIT_TIMEOUT   3000
 Default time (ms) to wait, in case of ambiguous match.
 
#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.
 
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
@ AST_STATE_RINGING
@ AST_STATE_UP
int ast_setstate(struct ast_channel *chan, enum ast_channel_state)
Change the state of a channel.
Definition channel.c:7373
#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:2982
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:10493
#define ast_channel_unlock(chan)
Definition channel.h:2983
@ AST_STATE_DOWN
@ AST_STATE_BUSY
@ AST_STATE_DIALING
@ AST_STATE_RESERVED
@ 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
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
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.
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
@ CWD_FORWARD
@ CWD_HOLD
@ CWD_CONFERENCE
@ CWD_ANNOUNCEMENT
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)
#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 @151 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 4421 of file sig_analog.c.

4422{
4423 /* No call waiting on non FXS channels */
4424 if ((p->sig != ANALOG_SIG_FXOKS) && (p->sig != ANALOG_SIG_FXOLS) && (p->sig != ANALOG_SIG_FXOGS)) {
4425 p->permcallwaiting = 0;
4426 }
4427
4429
4430 return 0;
4431}
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 4416 of file sig_analog.c.

4417{
4418 ast_free(doomed);
4419}
#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 4477 of file sig_analog.c.

4478{
4479 if (flag == -1) {
4480 return p->dnd;
4481 }
4482
4483 p->dnd = flag;
4484
4485 ast_verb(3, "%s DND on channel %d\n",
4486 flag ? "Enabled" : "Disabled",
4487 p->channel);
4488 analog_publish_dnd_state(p->channel, flag ? "enabled" : "disabled");
4489
4490 return 0;
4491}
long int flag
Definition f2c.h:83
static void analog_publish_dnd_state(int channel, const char *status)

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

Referenced by __analog_ss_thread(), dahdi_dnd(), and dahdichan_write_property().

◆ analog_exception()

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

Definition at line 3984 of file sig_analog.c.

3985{
3986 int res;
3987 int idx;
3988 struct ast_frame *f;
3989
3990 ast_debug(1, "%s %d\n", __FUNCTION__, p->channel);
3991
3992 idx = analog_get_index(ast, p, 1);
3993 if (idx < 0) {
3994 idx = ANALOG_SUB_REAL;
3995 }
3996
3997 p->subs[idx].f.frametype = AST_FRAME_NULL;
3998 p->subs[idx].f.datalen = 0;
3999 p->subs[idx].f.samples = 0;
4000 p->subs[idx].f.mallocd = 0;
4001 p->subs[idx].f.offset = 0;
4002 p->subs[idx].f.subclass.integer = 0;
4003 p->subs[idx].f.delivery = ast_tv(0,0);
4004 p->subs[idx].f.src = "dahdi_exception";
4005 p->subs[idx].f.data.ptr = NULL;
4006
4007 if (!p->owner) {
4008 /* If nobody owns us, absorb the event appropriately, otherwise
4009 we loop indefinitely. This occurs when, during call waiting, the
4010 other end hangs up our channel so that it no longer exists, but we
4011 have neither FLASH'd nor ONHOOK'd to signify our desire to
4012 change to the other channel. */
4013 res = analog_get_event(p);
4014
4015 /* Switch to real if there is one and this isn't something really silly... */
4016 if ((res != ANALOG_EVENT_RINGEROFF) && (res != ANALOG_EVENT_RINGERON) &&
4017 (res != ANALOG_EVENT_HOOKCOMPLETE)) {
4018 ast_debug(1, "Restoring owner of channel %d on event %d\n", p->channel, res);
4020 if (p->owner && ast != p->owner) {
4021 /*
4022 * Could this even happen?
4023 * Possible deadlock because we do not have the real-call lock.
4024 */
4025 ast_log(LOG_WARNING, "Event %s on %s is not restored owner %s\n",
4027 }
4028 if (p->owner) {
4030 }
4031 }
4032 switch (res) {
4035 if (p->owner) {
4036 ast_verb(3, "Channel %s still has call, ringing phone\n", ast_channel_name(p->owner));
4037 analog_ring(p);
4039 } else {
4040 ast_log(LOG_WARNING, "Absorbed %s, but nobody is left!?!?\n",
4041 analog_event2str(res));
4042 }
4044 break;
4047 analog_off_hook(p);
4048 if (p->owner && (ast_channel_state(p->owner) == AST_STATE_RINGING)) {
4050 analog_set_dialing(p, 0);
4051 }
4052 break;
4056 /* Do nothing */
4057 break;
4059 gettimeofday(&p->flashtime, NULL);
4060 if (p->owner) {
4061 ast_verb(3, "Channel %d flashed to other channel %s\n", p->channel, ast_channel_name(p->owner));
4063 /* Answer if necessary */
4066 }
4069 } else {
4070 ast_log(LOG_WARNING, "Absorbed %s, but nobody is left!?!?\n",
4071 analog_event2str(res));
4072 }
4074 break;
4075 default:
4076 ast_log(LOG_WARNING, "Don't know how to absorb event %s\n", analog_event2str(res));
4077 break;
4078 }
4079 f = &p->subs[idx].f;
4080 return f;
4081 }
4082 ast_debug(1, "Exception on %d, channel %d\n", ast_channel_fd(ast, 0), p->channel);
4083 /* If it's not us, return NULL immediately */
4084 if (ast != p->owner) {
4085 ast_log(LOG_WARNING, "We're %s, not %s\n", ast_channel_name(ast), ast_channel_name(p->owner));
4086 f = &p->subs[idx].f;
4087 return f;
4088 }
4089
4090 f = __analog_handle_event(p, ast);
4091 if (!f) {
4092 const char *name = ast_strdupa(ast_channel_name(ast));
4093
4094 /* Tell the CDR this DAHDI device hung up */
4096 ast_channel_unlock(ast);
4097 ast_set_hangupsource(ast, name, 0);
4098 ast_channel_lock(ast);
4100 }
4101 return f;
4102}
#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:2471
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)
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::@239 data
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 4439 of file sig_analog.c.

4440{
4441 struct analog_pvt *new_pvt = newp;
4442 int x;
4443 ast_debug(1, "New owner for channel %d is %s\n", new_pvt->channel, ast_channel_name(newchan));
4444 if (new_pvt->owner == oldchan) {
4445 analog_set_new_owner(new_pvt, newchan);
4446 }
4447 for (x = 0; x < 3; x++) {
4448 if (new_pvt->subs[x].owner == oldchan) {
4449 new_pvt->subs[x].owner = newchan;
4450 }
4451 }
4452
4453 analog_update_conf(new_pvt);
4454 return 0;
4455}

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 4433 of file sig_analog.c.

4434{
4435 ast_free(p);
4436}

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
INT32 integer
Definition lpc10.h:80
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)
static int analog_handles_digit(struct ast_frame *f)
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 4104 of file sig_analog.c.

4105{
4106 int res;
4107 pthread_t threadid;
4108 struct ast_channel *chan;
4109 ast_callid callid = 0;
4110 int callid_created;
4111
4112 ast_debug(1, "channel (%d) - signaling (%d) - event (%s)\n",
4114
4115 /* Handle an event on a given channel for the monitor thread. */
4116 switch (event) {
4119 switch (i->sig) {
4120 case ANALOG_SIG_FXSLS:
4121 case ANALOG_SIG_FXSGS:
4122 case ANALOG_SIG_FXSKS:
4123 if (i->immediate) {
4125 ast_log(LOG_WARNING, "Can't start PBX immediately, must wait for Caller ID / distinctive ring\n");
4126 } else {
4127 /* If we don't care about Caller ID or Distinctive Ring, then there's
4128 * no need to wait for anything before accepting the call, as
4129 * waiting will buy us nothing.
4130 * So if the channel is configured for immediate, actually start immediately
4131 * and get the show on the road as soon as possible. */
4132 ast_debug(1, "Disabling ring timeout (previously %d) to begin handling immediately\n", i->ringt_base);
4134 }
4135 }
4136 break;
4137 default:
4138 break;
4139 }
4140 /* Fall through */
4141 if (!(ISTRUNK(i) && i->immediate && !i->use_callerid && !i->usedistinctiveringdetection)) {
4142 break;
4143 }
4145 if (i->inalarm) {
4146 break;
4147 }
4148 /* Got a ring/answer. What kind of channel are we? */
4149 switch (i->sig) {
4150 case ANALOG_SIG_FXOLS:
4151 case ANALOG_SIG_FXOGS:
4152 case ANALOG_SIG_FXOKS:
4153 res = analog_off_hook(i);
4154 i->fxsoffhookstate = 1;
4155 i->cshactive = 0;
4157 if (res && (errno == EBUSY)) {
4158 break;
4159 }
4160 callid_created = ast_callid_threadstorage_auto(&callid);
4161
4162 /* Cancel VMWI spill */
4164
4165 if (i->immediate) {
4167 /* The channel is immediately up. Start right away */
4168 if (i->immediatering) {
4169 /* Play fake ringing, if we've been told to... */
4171 }
4173 if (!chan) {
4174 ast_log(LOG_WARNING, "Unable to start PBX on channel %d\n", i->channel);
4176 if (res < 0) {
4177 ast_log(LOG_WARNING, "Unable to play congestion tone on channel %d\n", i->channel);
4178 }
4179 }
4180 } else {
4181 /* Check for callerid, digits, etc */
4183 i->ss_astchan = chan;
4184 if (chan) {
4185 if (analog_has_voicemail(i)) {
4187 } else {
4189 }
4190 if (res < 0)
4191 ast_log(LOG_WARNING, "Unable to play dialtone on channel %d, do you have defaultzone and loadzone defined?\n", i->channel);
4192
4194 ast_log(LOG_WARNING, "Unable to start simple switch thread on channel %d\n", i->channel);
4196 if (res < 0) {
4197 ast_log(LOG_WARNING, "Unable to play congestion tone on channel %d\n", i->channel);
4198 }
4199 ast_hangup(chan);
4200 }
4201 } else
4202 ast_log(LOG_WARNING, "Unable to create channel\n");
4203 }
4205 break;
4206 case ANALOG_SIG_FXSLS:
4207 case ANALOG_SIG_FXSGS:
4208 case ANALOG_SIG_FXSKS:
4210 /* Fall through */
4211 case ANALOG_SIG_EMWINK:
4212 case ANALOG_SIG_FEATD:
4213 case ANALOG_SIG_FEATDMF:
4215 case ANALOG_SIG_E911:
4218 case ANALOG_SIG_FEATB:
4219 case ANALOG_SIG_EM:
4220 case ANALOG_SIG_EM_E1:
4221 case ANALOG_SIG_SFWINK:
4225 case ANALOG_SIG_SF:
4226 callid_created = ast_callid_threadstorage_auto(&callid);
4227 /* Check for callerid, digits, etc */
4230 } else {
4232 }
4233 i->ss_astchan = chan;
4234 if (!chan) {
4235 ast_log(LOG_WARNING, "Cannot allocate new structure on channel %d\n", i->channel);
4236 } else if (ast_pthread_create_detached(&threadid, NULL, __analog_ss_thread, i)) {
4237 ast_log(LOG_WARNING, "Unable to start simple switch thread on channel %d\n", i->channel);
4239 if (res < 0) {
4240 ast_log(LOG_WARNING, "Unable to play congestion tone on channel %d\n", i->channel);
4241 }
4242 ast_hangup(chan);
4243 }
4245 break;
4246 default:
4247 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);
4249 if (res < 0) {
4250 ast_log(LOG_WARNING, "Unable to play congestion tone on channel %d\n", i->channel);
4251 }
4252 return NULL;
4253 }
4254 break;
4256 analog_set_alarm(i, 0);
4258 break;
4259 case ANALOG_EVENT_ALARM:
4260 analog_set_alarm(i, 1);
4262 /* fall thru intentionally */
4264 /* Back on hook. Hang up. */
4265 switch (i->sig) {
4266 case ANALOG_SIG_FXOLS:
4267 case ANALOG_SIG_FXOGS:
4268 i->fxsoffhookstate = 0;
4270 /* Fall through */
4271 case ANALOG_SIG_FEATD:
4272 case ANALOG_SIG_FEATDMF:
4274 case ANALOG_SIG_E911:
4277 case ANALOG_SIG_FEATB:
4278 case ANALOG_SIG_EM:
4279 case ANALOG_SIG_EM_E1:
4280 case ANALOG_SIG_EMWINK:
4284 case ANALOG_SIG_SF:
4285 case ANALOG_SIG_SFWINK:
4286 case ANALOG_SIG_FXSLS:
4287 case ANALOG_SIG_FXSGS:
4288 case ANALOG_SIG_FXSKS:
4290 res = analog_play_tone(i, ANALOG_SUB_REAL, -1);
4291 analog_on_hook(i);
4292 break;
4293 case ANALOG_SIG_FXOKS:
4294 i->fxsoffhookstate = 0;
4297 /* Diddle the battery for the zhone */
4298#ifdef ZHONE_HACK
4299 analog_off_hook(i);
4300 usleep(1);
4301#endif
4302 res = analog_play_tone(i, ANALOG_SUB_REAL, -1);
4303 analog_on_hook(i);
4304 break;
4305 default:
4306 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);
4307 res = analog_play_tone(i, ANALOG_SUB_REAL, -1);
4308 return NULL;
4309 }
4310 break;
4312 switch (i->sig) {
4313 case ANALOG_SIG_FXSLS:
4314 case ANALOG_SIG_FXSKS:
4315 case ANALOG_SIG_FXSGS:
4316 callid_created = ast_callid_threadstorage_auto(&callid);
4317 /* We have already got a PR before the channel was
4318 created, but it wasn't handled. We need polarity
4319 to be REV for remote hangup detection to work.
4320 At least in Spain */
4321 if (i->hanguponpolarityswitch) {
4323 }
4326 ast_verb(2, "Starting post polarity CID detection on channel %d\n",
4327 i->channel);
4329 i->ss_astchan = chan;
4330 if (!chan) {
4331 ast_log(LOG_WARNING, "Cannot allocate new structure on channel %d\n", i->channel);
4332 } else if (ast_pthread_create_detached(&threadid, NULL, __analog_ss_thread, i)) {
4333 ast_log(LOG_WARNING, "Unable to start simple switch thread on channel %d\n", i->channel);
4334 ast_hangup(chan);
4335 }
4336 }
4338 break;
4339 default:
4341 "handle_init_event detected polarity reversal on non-FXO (ANALOG_SIG_FXS) interface %d\n",
4342 i->channel);
4343 break;
4344 }
4345 break;
4347 switch (i->sig) {
4348 case ANALOG_SIG_FXSLS:
4349 case ANALOG_SIG_FXSKS:
4350 case ANALOG_SIG_FXSGS:
4351 callid_created = ast_callid_threadstorage_auto(&callid);
4353 ast_verb(2, "Starting DTMF CID detection on channel %d\n",
4354 i->channel);
4356 i->ss_astchan = chan;
4357 if (!chan) {
4358 ast_log(LOG_WARNING, "Cannot allocate new structure on channel %d\n", i->channel);
4359 } else if (ast_pthread_create_detached(&threadid, NULL, __analog_ss_thread, i)) {
4360 ast_log(LOG_WARNING, "Unable to start simple switch thread on channel %d\n", i->channel);
4361 ast_hangup(chan);
4362 }
4363 }
4365 break;
4366 default:
4368 "handle_init_event detected dtmfcid generation event on non-FXO (ANALOG_SIG_FXS) interface %d\n",
4369 i->channel);
4370 break;
4371 }
4372 break;
4373 case ANALOG_EVENT_REMOVED: /* destroy channel, will actually do so in do_monitor */
4374 ast_log(LOG_NOTICE, "Got ANALOG_EVENT_REMOVED. Destroying channel %d\n",
4375 i->channel);
4376 return i->chan_pvt;
4379 break;
4382 break;
4383 }
4384 return NULL;
4385}
void ast_hangup(struct ast_channel *chan)
Hang up a channel.
Definition channel.c:2513
@ AST_STATE_RING
@ AST_STATE_PRERING
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)
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)
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)
static void analog_get_and_handle_alarms(struct analog_pvt *p)
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 fxsoffhookstate
Definition sig_analog.h:282
unsigned int inalarm
Definition sig_analog.h:344
struct ast_channel * ss_astchan
Definition sig_analog.h:382
Main Channel structure associated with a channel.
ast_callid callid
#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:7409
#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
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 4388 of file sig_analog.c.

4389{
4390 struct analog_pvt *p;
4391
4392 p = ast_calloc(1, sizeof(*p));
4393 if (!p) {
4394 return p;
4395 }
4396
4398 p->sig = signallingtype;
4399 p->chan_pvt = private_data;
4400
4401 /* Some defaults for values */
4404 /* Sub real is assumed to always be alloc'd */
4405 p->subs[ANALOG_SUB_REAL].allocd = 1;
4406
4407 return p;
4408}
#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}
enum analog_sigtype sigtype
Definition sig_analog.c:69
static const struct @150 sigtypes[]

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 3043 of file sig_analog.c.

3044{
3045 pthread_t threadid;
3046
3047 p->ss_astchan = chan;
3049}

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 3666 of file chan_dahdi.c.

3667{
3668 .play_tone = my_play_tone,
3669 .get_event = my_get_event,
3670 .wait_event = my_wait_event,
3671 .is_off_hook = my_is_off_hook,
3672 .set_echocanceller = my_set_echocanceller,
3673 .ring = my_ring,
3674 .flash = my_flash,
3675 .off_hook = my_off_hook,
3676 .dial_digits = my_dial_digits,
3677 .train_echocanceller = my_train_echocanceller,
3678 .on_hook = my_on_hook,
3679 .is_dialing = my_is_dialing,
3680 .allocate_sub = my_allocate_sub,
3681 .unallocate_sub = my_unallocate_sub,
3682 .swap_subs = my_swap_subchannels,
3683 .has_voicemail = my_has_voicemail,
3684 .check_for_conference = my_check_for_conference,
3685 .conf_add = my_conf_add,
3686 .conf_del = my_conf_del,
3687 .complete_conference_update = my_complete_conference_update,
3688 .start = my_start,
3689 .all_subchannels_hungup = my_all_subchannels_hungup,
3690 .lock_private = my_lock_private,
3691 .unlock_private = my_unlock_private,
3692 .deadlock_avoidance_private = my_deadlock_avoidance_private,
3693 .handle_dtmf = my_handle_dtmf,
3694 .wink = my_wink,
3695 .new_ast_channel = my_new_analog_ast_channel,
3696 .dsp_set_digitmode = my_dsp_set_digitmode,
3697 .dsp_reset_and_flush_digits = my_dsp_reset_and_flush_digits,
3698 .send_callerid = my_send_callerid,
3699 .callwait = my_callwait,
3700 .stop_callwait = my_stop_callwait,
3701 .get_callerid = my_get_callerid,
3702 .start_cid_detect = my_start_cid_detect,
3703 .stop_cid_detect = my_stop_cid_detect,
3704 .handle_notify_message = my_handle_notify_message,
3705 .increase_ss_count = my_increase_ss_count,
3706 .decrease_ss_count = my_decrease_ss_count,
3707 .distinctive_ring = my_distinctive_ring,
3708 .set_linear_mode = my_set_linear_mode,
3709 .set_inthreeway = my_set_inthreeway,
3710 .get_and_handle_alarms = my_get_and_handle_alarms,
3711 .get_sigpvt_bridged_channel = my_get_sigpvt_bridged_channel,
3712 .get_sub_fd = my_get_sub_fd,
3713 .set_cadence = my_set_cadence,
3714 .set_alarm = my_set_alarm,
3715 .set_dialing = my_set_dialing,
3716 .set_outgoing = my_set_outgoing,
3717 .set_ringtimeout = my_set_ringtimeout,
3718 .set_waitingfordt = my_set_waitingfordt,
3719 .check_waitingfordt = my_check_waitingfordt,
3720 .set_confirmanswer = my_set_confirmanswer,
3721 .check_confirmanswer = my_check_confirmanswer,
3722 .set_callwaiting = my_set_callwaiting,
3723 .cancel_cidspill = my_cancel_cidspill,
3724 .confmute = my_confmute,
3725 .set_pulsedial = my_set_pulsedial,
3726 .set_new_owner = my_set_new_owner,
3727 .get_orig_dialstring = my_get_orig_dialstring,
3728 .set_needringing = my_set_needringing,
3729 .set_polarity = my_set_polarity,
3730 .start_polarityswitch = my_start_polarityswitch,
3731 .answer_polarityswitch = my_answer_polarityswitch,
3732 .hangup_polarityswitch = my_hangup_polarityswitch,
3733 .have_progressdetect = my_have_progressdetect,
3734 .get_firstdigit_timeout = my_get_firstdigit_timeout,
3735 .get_matchdigit_timeout = my_get_matchdigit_timeout,
3736 .get_interdigit_timeout = my_get_interdigit_timeout,
3737};
static void my_set_new_owner(void *pvt, struct ast_channel *new_owner)
static void my_set_confirmanswer(void *pvt, int flag)
static int my_callwait(void *pvt)
static int my_check_confirmanswer(void *pvt)
static int my_is_dialing(void *pvt, enum analog_sub sub)
static int my_dial_digits(void *pvt, enum analog_sub sub, struct analog_dialoperation *dop)
static void my_cancel_cidspill(void *pvt)
static int my_set_echocanceller(void *pvt, int enable)
static void my_hangup_polarityswitch(void *pvt)
static int my_stop_cid_detect(void *pvt)
static int my_get_sub_fd(void *pvt, enum analog_sub sub)
static void my_set_needringing(void *pvt, int value)
static void my_unlock_private(void *pvt)
static void my_set_dialing(void *pvt, int is_dialing)
static void my_handle_dtmf(void *pvt, struct ast_channel *ast, enum analog_sub analog_index, struct ast_frame **dest)
static int my_on_hook(void *pvt)
static void my_set_pulsedial(void *pvt, int flag)
static int my_unallocate_sub(void *pvt, enum analog_sub analogsub)
static void my_set_alarm(void *pvt, int in_alarm)
static int my_dsp_set_digitmode(void *pvt, enum analog_dsp_digitmode mode)
static int my_get_event(void *pvt)
static void my_set_callwaiting(void *pvt, int callwaiting_enable)
static int my_is_off_hook(void *pvt)
static int my_check_waitingfordt(void *pvt)
static void my_set_outgoing(void *pvt, int is_outgoing)
static void my_set_inthreeway(void *pvt, enum analog_sub sub, int inthreeway)
static void my_swap_subchannels(void *pvt, enum analog_sub a, struct ast_channel *ast_a, enum analog_sub b, struct ast_channel *ast_b)
static void my_get_and_handle_alarms(void *pvt)
static void my_lock_private(void *pvt)
static int my_stop_callwait(void *pvt)
static int my_distinctive_ring(struct ast_channel *chan, void *pvt, int idx, int *ringdata)
static void my_handle_notify_message(struct ast_channel *chan, void *pvt, int cid_flags, int neon_mwievent)
static int my_confmute(void *pvt, int mute)
static int my_send_callerid(void *pvt, int cwcid, struct ast_party_caller *caller)
static void my_decrease_ss_count(void)
static void my_start_polarityswitch(void *pvt)
static int my_wait_event(void *pvt)
static struct ast_channel * my_new_analog_ast_channel(void *pvt, int state, int startpbx, enum analog_sub sub, const struct ast_channel *requestor)
static int my_get_callerid(void *pvt, char *namebuf, char *numbuf, enum analog_event *ev, size_t timeout)
static int my_start(void *pvt)
static void my_answer_polarityswitch(void *pvt)
static int my_have_progressdetect(void *pvt)
static int my_train_echocanceller(void *pvt)
static void my_set_polarity(void *pvt, int value)
static int my_set_linear_mode(void *pvt, enum analog_sub sub, int linear_mode)
static void my_all_subchannels_hungup(void *pvt)
static int my_ring(void *pvt)
static int my_start_cid_detect(void *pvt, int cid_signalling)
static int my_complete_conference_update(void *pvt, int needconference)
static void my_set_cadence(void *pvt, int *cid_rings, struct ast_channel *ast)
static void my_increase_ss_count(void)
static int my_play_tone(void *pvt, enum analog_sub sub, enum analog_tone tone)
static int my_wink(void *pvt, enum analog_sub sub)
static int my_conf_add(void *pvt, enum analog_sub sub)
static int my_dsp_reset_and_flush_digits(void *pvt)
static int my_has_voicemail(void *pvt)
static const char * my_get_orig_dialstring(void *pvt)
static int my_conf_del(void *pvt, enum analog_sub sub)
static int my_off_hook(void *pvt)
static int my_allocate_sub(void *pvt, enum analog_sub analogsub)
static void * my_get_sigpvt_bridged_channel(struct ast_channel *chan)
static void my_set_waitingfordt(void *pvt, struct ast_channel *ast)
static int my_check_for_conference(void *pvt)
static int my_flash(void *pvt)
static void my_deadlock_avoidance_private(void *pvt)
static void my_set_ringtimeout(void *pvt, int ringt)

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().