Asterisk - The Open Source Telephony Project  GIT-master-93d0901
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_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)
 
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 119 of file sig_analog.h.

119  {
124 };
@ ANALOG_CID_START_RING
Definition: sig_analog.h:122
@ ANALOG_CID_START_DTMF_NOALERT
Definition: sig_analog.h:123
@ ANALOG_CID_START_POLARITY
Definition: sig_analog.h:120
@ ANALOG_CID_START_POLARITY_IN
Definition: sig_analog.h:121

◆ 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,
47  ANALOG_SIG_FXOLS = 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 126 of file sig_analog.h.

126  {
128 };
@ ANALOG_DIAL_OP_REPLACE
Definition: sig_analog.h:127

Function Documentation

◆ analog_answer()

int analog_answer ( struct analog_pvt p,
struct ast_channel ast 
)

Definition at line 1459 of file sig_analog.c.

1460 {
1461  int res = 0;
1462  int idx;
1463  int oldstate = ast_channel_state(ast);
1464 
1465  ast_debug(1, "%s %d\n", __FUNCTION__, p->channel);
1466  ast_setstate(ast, AST_STATE_UP);
1467  idx = analog_get_index(ast, p, 1);
1468  if (idx < 0) {
1469  idx = ANALOG_SUB_REAL;
1470  }
1471  switch (p->sig) {
1472  case ANALOG_SIG_FXSLS:
1473  case ANALOG_SIG_FXSGS:
1474  case ANALOG_SIG_FXSKS:
1475  analog_set_ringtimeout(p, 0);
1476  /* Fall through */
1477  case ANALOG_SIG_EM:
1478  case ANALOG_SIG_EM_E1:
1479  case ANALOG_SIG_EMWINK:
1480  case ANALOG_SIG_FEATD:
1481  case ANALOG_SIG_FEATDMF:
1482  case ANALOG_SIG_FEATDMF_TA:
1483  case ANALOG_SIG_E911:
1484  case ANALOG_SIG_FGC_CAMA:
1485  case ANALOG_SIG_FGC_CAMAMF:
1486  case ANALOG_SIG_FEATB:
1487  case ANALOG_SIG_SF:
1488  case ANALOG_SIG_SFWINK:
1489  case ANALOG_SIG_SF_FEATD:
1490  case ANALOG_SIG_SF_FEATDMF:
1491  case ANALOG_SIG_SF_FEATB:
1492  case ANALOG_SIG_FXOLS:
1493  case ANALOG_SIG_FXOGS:
1494  case ANALOG_SIG_FXOKS:
1495  /* Pick up the line */
1496  ast_debug(1, "Took %s off hook\n", ast_channel_name(ast));
1497  if (p->hanguponpolarityswitch) {
1498  gettimeofday(&p->polaritydelaytv, NULL);
1499  }
1500  res = analog_off_hook(p);
1501  analog_play_tone(p, idx, -1);
1502  analog_set_dialing(p, 0);
1503  if ((idx == ANALOG_SUB_REAL) && p->subs[ANALOG_SUB_THREEWAY].inthreeway) {
1504  if (oldstate == AST_STATE_RINGING) {
1505  ast_debug(1, "Finally swapping real and threeway\n");
1509  }
1510  }
1511 
1512  switch (p->sig) {
1513  case ANALOG_SIG_FXSLS:
1514  case ANALOG_SIG_FXSKS:
1515  case ANALOG_SIG_FXSGS:
1518  break;
1519  case ANALOG_SIG_FXOLS:
1520  case ANALOG_SIG_FXOKS:
1521  case ANALOG_SIG_FXOGS:
1523  break;
1524  default:
1525  break;
1526  }
1527  break;
1528  default:
1529  ast_log(LOG_WARNING, "Don't know how to answer signalling %d (channel %d)\n", p->sig, p->channel);
1530  res = -1;
1531  break;
1532  }
1533  ast_setstate(ast, AST_STATE_UP);
1534  return res;
1535 }
#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:7469
#define ast_debug(level,...)
Log a DEBUG message.
Definition: logger.h:451
#define LOG_WARNING
Definition: logger.h:275
#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:446
static int analog_train_echocanceller(struct analog_pvt *p)
Definition: sig_analog.c:481
static void analog_set_dialing(struct analog_pvt *p, int is_dialing)
Definition: sig_analog.c:890
static void analog_set_ringtimeout(struct analog_pvt *p, int ringt)
Definition: sig_analog.c:906
#define analog_get_index(ast, p, nullok)
Definition: sig_analog.c:407
static void analog_answer_polarityswitch(struct analog_pvt *p)
Definition: sig_analog.c:645
static int analog_off_hook(struct analog_pvt *p)
Definition: sig_analog.c:615
static int analog_play_tone(struct analog_pvt *p, enum analog_sub sub, enum analog_tone tone)
Definition: sig_analog.c:438
static int analog_set_echocanceller(struct analog_pvt *p, int enable)
Definition: sig_analog.c:473
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:346
unsigned int hanguponpolarityswitch
Definition: sig_analog.h:289
enum analog_sigtype sig
Definition: sig_analog.h:266
struct analog_subchannel subs[3]
Definition: sig_analog.h:272
unsigned int inthreeway
Definition: sig_analog.h:259
struct ast_channel * owner
Definition: sig_analog.h:257

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

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

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

986 {
987  int res, idx, mysig;
988  char *c, *n, *l;
989  char dest[256]; /* must be same length as p->dialdest */
990 
991  ast_debug(1, "CALLING CID_NAME: %s CID_NUM:: %s\n",
992  S_COR(ast_channel_connected(ast)->id.name.valid, ast_channel_connected(ast)->id.name.str, ""),
993  S_COR(ast_channel_connected(ast)->id.number.valid, ast_channel_connected(ast)->id.number.str, ""));
994 
995  ast_copy_string(dest, rdest, sizeof(dest));
996  ast_copy_string(p->dialdest, rdest, sizeof(p->dialdest));
997 
998  if ((ast_channel_state(ast) == AST_STATE_BUSY)) {
1000  return 0;
1001  }
1002 
1004  ast_log(LOG_WARNING, "analog_call called on %s, neither down nor reserved\n", ast_channel_name(ast));
1005  return -1;
1006  }
1007 
1008  p->dialednone = 0;
1009  analog_set_outgoing(p, 1);
1010 
1011  mysig = p->sig;
1012  if (p->outsigmod > -1) {
1013  mysig = p->outsigmod;
1014  }
1015 
1016  switch (mysig) {
1017  case ANALOG_SIG_FXOLS:
1018  case ANALOG_SIG_FXOGS:
1019  case ANALOG_SIG_FXOKS:
1020  if (p->owner == ast) {
1021  /* Normal ring, on hook */
1022 
1023  /* Don't send audio while on hook, until the call is answered */
1024  analog_set_dialing(p, 1);
1025  analog_set_cadence(p, ast); /* and set p->cidrings */
1026 
1027  /* nick@dccinc.com 4/3/03 mods to allow for deferred dialing */
1028  c = strchr(dest, '/');
1029  if (c) {
1030  c++;
1031  }
1032  if (c && (strlen(c) < p->stripmsd)) {
1033  ast_log(LOG_WARNING, "Number '%s' is shorter than stripmsd (%d)\n", c, p->stripmsd);
1034  c = NULL;
1035  }
1036  if (c) {
1038  snprintf(p->dop.dialstr, sizeof(p->dop.dialstr), "Tw%s", c);
1039  ast_debug(1, "FXO: setup deferred dialstring: %s\n", c);
1040  } else {
1041  p->dop.dialstr[0] = '\0';
1042  }
1043 
1044  if (analog_ring(p)) {
1045  ast_log(LOG_WARNING, "Unable to ring phone: %s\n", strerror(errno));
1046  return -1;
1047  }
1048  analog_set_dialing(p, 1);
1049  } else {
1050  /* Call waiting call */
1051  if (ast_channel_connected(ast)->id.number.valid && ast_channel_connected(ast)->id.number.str) {
1053  } else {
1054  p->callwait_num[0] = '\0';
1055  }
1056  if (ast_channel_connected(ast)->id.name.valid && ast_channel_connected(ast)->id.name.str) {
1058  } else {
1059  p->callwait_name[0] = '\0';
1060  }
1061 
1062  /* Call waiting tone instead */
1063  if (analog_callwait(p)) {
1064  return -1;
1065  }
1066  /* Make ring-back */
1068  ast_log(LOG_WARNING, "Unable to generate call-wait ring-back on channel %s\n", ast_channel_name(ast));
1069  }
1070 
1071  }
1074  if (l) {
1075  ast_copy_string(p->lastcid_num, l, sizeof(p->lastcid_num));
1076  } else {
1077  p->lastcid_num[0] = '\0';
1078  }
1079  if (n) {
1080  ast_copy_string(p->lastcid_name, n, sizeof(p->lastcid_name));
1081  } else {
1082  p->lastcid_name[0] = '\0';
1083  }
1084 
1085  if (p->use_callerid) {
1086  p->caller.id.name.str = p->lastcid_name;
1087  p->caller.id.number.str = p->lastcid_num;
1088  }
1089 
1091  idx = analog_get_index(ast, p, 0);
1092  if (idx > -1) {
1093  struct ast_cc_config_params *cc_params;
1094 
1095  /* This is where the initial ringing frame is queued for an analog call.
1096  * As such, this is a great time to offer CCNR to the caller if it's available.
1097  */
1098  cc_params = ast_channel_get_cc_config_params(p->subs[idx].owner);
1099  if (cc_params) {
1100  switch (ast_get_cc_monitor_policy(cc_params)) {
1101  case AST_CC_MONITOR_NEVER:
1102  break;
1103  case AST_CC_MONITOR_NATIVE:
1104  case AST_CC_MONITOR_ALWAYS:
1108  break;
1109  }
1110  }
1112  }
1113  break;
1114  case ANALOG_SIG_FXSLS:
1115  case ANALOG_SIG_FXSGS:
1116  case ANALOG_SIG_FXSKS:
1118  ast_debug(1, "Ignore possible polarity reversal on line seizure\n");
1119  p->polaritydelaytv = ast_tvnow();
1120  }
1121  /* fall through */
1122  case ANALOG_SIG_EMWINK:
1123  case ANALOG_SIG_EM:
1124  case ANALOG_SIG_EM_E1:
1125  case ANALOG_SIG_FEATD:
1126  case ANALOG_SIG_FEATDMF:
1127  case ANALOG_SIG_E911:
1128  case ANALOG_SIG_FGC_CAMA:
1129  case ANALOG_SIG_FGC_CAMAMF:
1130  case ANALOG_SIG_FEATB:
1131  case ANALOG_SIG_SFWINK:
1132  case ANALOG_SIG_SF:
1133  case ANALOG_SIG_SF_FEATD:
1134  case ANALOG_SIG_SF_FEATDMF:
1135  case ANALOG_SIG_FEATDMF_TA:
1136  case ANALOG_SIG_SF_FEATB:
1137  c = strchr(dest, '/');
1138  if (c) {
1139  c++;
1140  } else {
1141  c = "";
1142  }
1143  if (strlen(c) < p->stripmsd) {
1144  ast_log(LOG_WARNING, "Number '%s' is shorter than stripmsd (%d)\n", c, p->stripmsd);
1145  return -1;
1146  }
1147  res = analog_start(p);
1148  if (res < 0) {
1149  if (errno != EINPROGRESS) {
1150  return -1;
1151  }
1152  }
1153  ast_debug(1, "Dialing '%s'\n", c);
1155 
1156  c += p->stripmsd;
1157 
1158  switch (mysig) {
1159  case ANALOG_SIG_FEATD:
1161  if (l) {
1162  snprintf(p->dop.dialstr, sizeof(p->dop.dialstr), "T*%s*%s*", l, c);
1163  } else {
1164  snprintf(p->dop.dialstr, sizeof(p->dop.dialstr), "T**%s*", c);
1165  }
1166  break;
1167  case ANALOG_SIG_FEATDMF:
1169  if (l) {
1170  snprintf(p->dop.dialstr, sizeof(p->dop.dialstr), "M*00%s#*%s#", l, c);
1171  } else {
1172  snprintf(p->dop.dialstr, sizeof(p->dop.dialstr), "M*02#*%s#", c);
1173  }
1174  break;
1175  case ANALOG_SIG_FEATDMF_TA:
1176  {
1177  const char *cic = "", *ozz = "";
1178 
1179  /* If you have to go through a Tandem Access point you need to use this */
1180 #ifndef STANDALONE
1181  ozz = pbx_builtin_getvar_helper(p->owner, "FEATDMF_OZZ");
1182  if (!ozz) {
1183  ozz = analog_defaultozz;
1184  }
1185  cic = pbx_builtin_getvar_helper(p->owner, "FEATDMF_CIC");
1186  if (!cic) {
1187  cic = analog_defaultcic;
1188  }
1189 #endif
1190  if (!ozz || !cic) {
1191  ast_log(LOG_WARNING, "Unable to dial channel of type feature group D MF tandem access without CIC or OZZ set\n");
1192  return -1;
1193  }
1194  snprintf(p->dop.dialstr, sizeof(p->dop.dialstr), "M*%s%s#", ozz, cic);
1195  snprintf(p->finaldial, sizeof(p->finaldial), "M*%s#", c);
1196  p->whichwink = 0;
1197  }
1198  break;
1199  case ANALOG_SIG_E911:
1200  ast_copy_string(p->dop.dialstr, "M*911#", sizeof(p->dop.dialstr));
1201  break;
1202  case ANALOG_SIG_FGC_CAMA:
1203  snprintf(p->dop.dialstr, sizeof(p->dop.dialstr), "P%s", c);
1204  break;
1205  case ANALOG_SIG_FGC_CAMAMF:
1206  case ANALOG_SIG_FEATB:
1207  snprintf(p->dop.dialstr, sizeof(p->dop.dialstr), "M*%s#", c);
1208  break;
1209  default:
1210  if (p->pulse) {
1211  snprintf(p->dop.dialstr, sizeof(p->dop.dialstr), "P%sw", c);
1212  } else {
1213  snprintf(p->dop.dialstr, sizeof(p->dop.dialstr), "T%sw", c);
1214  }
1215  break;
1216  }
1217 
1218  if (p->echotraining && (strlen(p->dop.dialstr) > 4)) {
1219  memset(p->echorest, 'w', sizeof(p->echorest) - 1);
1220  strcpy(p->echorest + (p->echotraining / 400) + 1, p->dop.dialstr + strlen(p->dop.dialstr) - 2);
1221  p->echorest[sizeof(p->echorest) - 1] = '\0';
1222  p->echobreak = 1;
1223  p->dop.dialstr[strlen(p->dop.dialstr)-2] = '\0';
1224  } else {
1225  p->echobreak = 0;
1226  }
1227  analog_set_waitingfordt(p, ast);
1228  if (!res) {
1229  if (analog_dial_digits(p, ANALOG_SUB_REAL, &p->dop)) {
1230  analog_on_hook(p);
1231  return -1;
1232  }
1233  } else {
1234  ast_debug(1, "Deferring dialing...\n");
1235  }
1236  analog_set_dialing(p, 1);
1237  if (ast_strlen_zero(c)) {
1238  p->dialednone = 1;
1239  }
1241  break;
1242  default:
1243  ast_debug(1, "not yet implemented\n");
1244  return -1;
1245  }
1246  return 0;
1247 }
#define AST_CC_GENERIC_MONITOR_TYPE
Definition: ccss.h:471
@ 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:884
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:4147
struct ast_party_connected_line * ast_channel_connected(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:1225
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:10660
@ 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 char analog_defaultozz[64]
Definition: sig_analog.c:66
static int analog_callwait(struct analog_pvt *p)
Definition: sig_analog.c:866
static void analog_set_outgoing(struct analog_pvt *p, int is_outgoing)
Definition: sig_analog.c:537
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:521
static int analog_ring(struct analog_pvt *p)
Definition: sig_analog.c:497
static void analog_set_cadence(struct analog_pvt *p, struct ast_channel *chan)
Definition: sig_analog.c:883
const char * name
Definition: sig_analog.c:70
static int analog_on_hook(struct analog_pvt *p)
Definition: sig_analog.c:529
static int analog_start(struct analog_pvt *p)
Definition: sig_analog.c:513
static void analog_set_waitingfordt(struct analog_pvt *p, struct ast_channel *ast)
Definition: sig_analog.c:914
static const char * analog_get_orig_dialstring(struct analog_pvt *p)
Definition: sig_analog.c:186
#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:404
char dialdest[256]
Definition: sig_analog.h:347
struct analog_dialoperation dop
Definition: sig_analog.h:273
int whichwink
Definition: sig_analog.h:350
enum analog_sigtype outsigmod
Definition: sig_analog.h:310
unsigned int answeronpolarityswitch
Definition: sig_analog.h:284
unsigned int pulse
Definition: sig_analog.h:293
int echotraining
Definition: sig_analog.h:311
char callwait_num[AST_MAX_EXTENSION]
Definition: sig_analog.h:338
unsigned int echobreak
Definition: sig_analog.h:326
char lastcid_name[AST_MAX_EXTENSION]
Definition: sig_analog.h:341
unsigned int dialednone
Definition: sig_analog.h:323
char echorest[20]
Definition: sig_analog.h:344
char lastcid_num[AST_MAX_EXTENSION]
Definition: sig_analog.h:340
char finaldial[64]
Definition: sig_analog.h:351
int stripmsd
Definition: sig_analog.h:314
unsigned int use_callerid
Definition: sig_analog.h:297
char callwait_name[AST_MAX_EXTENSION]
Definition: sig_analog.h:339
struct ast_party_caller caller
Definition: sig_analog.h:342
struct ast_party_id id
Caller party ID.
Definition: channel.h:420
struct ast_party_id id
Connected party ID.
Definition: channel.h:458
struct ast_party_name name
Subscriber name.
Definition: channel.h:340
struct ast_party_number number
Subscriber phone number.
Definition: channel.h:342
unsigned char valid
TRUE if the name information is valid/present.
Definition: channel.h:279
char * str
Subscriber name (Malloced)
Definition: channel.h:264
unsigned char valid
TRUE if the number information is valid/present.
Definition: channel.h:297
char * str
Subscriber phone number (Malloced)
Definition: channel.h:291
Number structure.
Definition: app_followme.c:154
static struct test_val c
struct timeval ast_tvnow(void)
Returns current timeval. Meant to replace calls to gettimeofday().
Definition: time.h:150

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_name(), 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_tvnow(), c, analog_pvt::caller, analog_pvt::callwait_name, analog_pvt::callwait_num, 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, 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, analog_pvt::pulse, 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_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 @153 cidtypes[]
unsigned int cid_type
Definition: sig_analog.c:96
#define ARRAY_LEN(a)
Definition: utils.h:661

References ARRAY_LEN, cid_type, and cidtypes.

◆ analog_config_complete()

int analog_config_complete ( struct analog_pvt p)

Definition at line 4001 of file sig_analog.c.

4002 {
4003  /* No call waiting on non FXS channels */
4004  if ((p->sig != ANALOG_SIG_FXOKS) && (p->sig != ANALOG_SIG_FXOLS) && (p->sig != ANALOG_SIG_FXOGS)) {
4005  p->permcallwaiting = 0;
4006  }
4007 
4009 
4010  return 0;
4011 }
static void analog_set_callwaiting(struct analog_pvt *p, int callwaiting_enable)
Definition: sig_analog.c:875
unsigned int permcallwaiting
Definition: sig_analog.h:291

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

3997 {
3998  ast_free(doomed);
3999 }
#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 4057 of file sig_analog.c.

4058 {
4059  if (flag == -1) {
4060  return p->dnd;
4061  }
4062 
4063  p->dnd = flag;
4064 
4065  ast_verb(3, "%s DND on channel %d\n",
4066  flag ? "Enabled" : "Disabled",
4067  p->channel);
4068  analog_publish_dnd_state(p->channel, flag ? "enabled" : "disabled");
4069 
4070  return 0;
4071 }
long int flag
Definition: f2c.h:83
#define ast_verb(level,...)
Definition: logger.h:462
static void analog_publish_dnd_state(int channel, const char *status)
Definition: sig_analog.c:4037

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

3596 {
3597  int res;
3598  int idx;
3599  struct ast_frame *f;
3600 
3601  ast_debug(1, "%s %d\n", __FUNCTION__, p->channel);
3602 
3603  idx = analog_get_index(ast, p, 1);
3604  if (idx < 0) {
3605  idx = ANALOG_SUB_REAL;
3606  }
3607 
3608  p->subs[idx].f.frametype = AST_FRAME_NULL;
3609  p->subs[idx].f.datalen = 0;
3610  p->subs[idx].f.samples = 0;
3611  p->subs[idx].f.mallocd = 0;
3612  p->subs[idx].f.offset = 0;
3613  p->subs[idx].f.subclass.integer = 0;
3614  p->subs[idx].f.delivery = ast_tv(0,0);
3615  p->subs[idx].f.src = "dahdi_exception";
3616  p->subs[idx].f.data.ptr = NULL;
3617 
3618  if (!p->owner) {
3619  /* If nobody owns us, absorb the event appropriately, otherwise
3620  we loop indefinitely. This occurs when, during call waiting, the
3621  other end hangs up our channel so that it no longer exists, but we
3622  have neither FLASH'd nor ONHOOK'd to signify our desire to
3623  change to the other channel. */
3624  res = analog_get_event(p);
3625 
3626  /* Switch to real if there is one and this isn't something really silly... */
3627  if ((res != ANALOG_EVENT_RINGEROFF) && (res != ANALOG_EVENT_RINGERON) &&
3628  (res != ANALOG_EVENT_HOOKCOMPLETE)) {
3629  ast_debug(1, "Restoring owner of channel %d on event %d\n", p->channel, res);
3631  if (p->owner && ast != p->owner) {
3632  /*
3633  * Could this even happen?
3634  * Possible deadlock because we do not have the real-call lock.
3635  */
3636  ast_log(LOG_WARNING, "Event %s on %s is not restored owner %s\n",
3638  }
3639  if (p->owner) {
3640  ast_queue_unhold(p->owner);
3641  }
3642  }
3643  switch (res) {
3644  case ANALOG_EVENT_ONHOOK:
3646  if (p->owner) {
3647  ast_verb(3, "Channel %s still has call, ringing phone\n", ast_channel_name(p->owner));
3648  analog_ring(p);
3650  } else {
3651  ast_log(LOG_WARNING, "Absorbed %s, but nobody is left!?!?\n",
3652  analog_event2str(res));
3653  }
3654  analog_update_conf(p);
3655  break;
3658  analog_off_hook(p);
3659  if (p->owner && (ast_channel_state(p->owner) == AST_STATE_RINGING)) {
3661  analog_set_dialing(p, 0);
3662  }
3663  break;
3665  case ANALOG_EVENT_RINGERON:
3667  /* Do nothing */
3668  break;
3670  gettimeofday(&p->flashtime, NULL);
3671  if (p->owner) {
3672  ast_verb(3, "Channel %d flashed to other channel %s\n", p->channel, ast_channel_name(p->owner));
3673  if (ast_channel_state(p->owner) != AST_STATE_UP) {
3674  /* Answer if necessary */
3677  }
3679  ast_queue_unhold(p->owner);
3680  } else {
3681  ast_log(LOG_WARNING, "Absorbed %s, but nobody is left!?!?\n",
3682  analog_event2str(res));
3683  }
3684  analog_update_conf(p);
3685  break;
3686  default:
3687  ast_log(LOG_WARNING, "Don't know how to absorb event %s\n", analog_event2str(res));
3688  break;
3689  }
3690  f = &p->subs[idx].f;
3691  return f;
3692  }
3693  ast_debug(1, "Exception on %d, channel %d\n", ast_channel_fd(ast, 0), p->channel);
3694  /* If it's not us, return NULL immediately */
3695  if (ast != p->owner) {
3696  ast_log(LOG_WARNING, "We're %s, not %s\n", ast_channel_name(ast), ast_channel_name(p->owner));
3697  f = &p->subs[idx].f;
3698  return f;
3699  }
3700 
3701  f = __analog_handle_event(p, ast);
3702  if (!f) {
3703  const char *name = ast_strdupa(ast_channel_name(ast));
3704 
3705  /* Tell the CDR this DAHDI device hung up */
3707  ast_channel_unlock(ast);
3708  ast_set_hangupsource(ast, name, 0);
3709  ast_channel_lock(ast);
3711  }
3712  return f;
3713 }
#define ast_strdupa(s)
duplicate a string in memory from the stack
Definition: astmm.h:298
#define ast_channel_lock(chan)
Definition: channel.h:2922
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:2498
int ast_queue_unhold(struct ast_channel *chan)
Queue an unhold frame.
Definition: channel.c:1210
#define ast_channel_unlock(chan)
Definition: channel.h:2923
@ AST_FRAME_NULL
@ AST_CONTROL_ANSWER
static int analog_update_conf(struct analog_pvt *p)
Definition: sig_analog.c:743
static void analog_unlock_private(struct analog_pvt *p)
Definition: sig_analog.c:560
static void analog_lock_private(struct analog_pvt *p)
Definition: sig_analog.c:567
static int analog_stop_callwait(struct analog_pvt *p)
Definition: sig_analog.c:857
static char * analog_event2str(enum analog_event event)
Definition: sig_analog.c:265
static int analog_get_event(struct analog_pvt *p)
Definition: sig_analog.c:194
static struct ast_frame * __analog_handle_event(struct analog_pvt *p, struct ast_channel *ast)
Definition: sig_analog.c:2725
struct timeval flashtime
Definition: sig_analog.h:349
struct ast_frame f
Definition: sig_analog.h:258
Data structure associated with a single frame of data.
struct ast_frame_subclass subclass
struct timeval delivery
enum ast_frame_type frametype
const char * src
union ast_frame::@253 data
struct timeval ast_tv(ast_time_t sec, ast_suseconds_t usec)
Returns a timeval from sec, usec.
Definition: time.h:226

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

4020 {
4021  struct analog_pvt *new_pvt = newp;
4022  int x;
4023  ast_debug(1, "New owner for channel %d is %s\n", new_pvt->channel, ast_channel_name(newchan));
4024  if (new_pvt->owner == oldchan) {
4025  analog_set_new_owner(new_pvt, newchan);
4026  }
4027  for (x = 0; x < 3; x++) {
4028  if (new_pvt->subs[x].owner == oldchan) {
4029  new_pvt->subs[x].owner = newchan;
4030  }
4031  }
4032 
4033  analog_update_conf(new_pvt);
4034  return 0;
4035 }

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

4014 {
4015  ast_free(p);
4016 }

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

1563 {
1564  struct ast_frame *f = *dest;
1565 
1566  ast_debug(1, "%s DTMF digit: 0x%02X '%c' on %s\n",
1567  f->frametype == AST_FRAME_DTMF_BEGIN ? "Begin" : "End",
1568  (unsigned)f->subclass.integer, f->subclass.integer, ast_channel_name(ast));
1569 
1570  if (analog_check_confirmanswer(p)) {
1571  if (f->frametype == AST_FRAME_DTMF_END) {
1572  ast_debug(1, "Confirm answer on %s!\n", ast_channel_name(ast));
1573  /* Upon receiving a DTMF digit, consider this an answer confirmation instead
1574  of a DTMF digit */
1575  p->subs[idx].f.frametype = AST_FRAME_CONTROL;
1577  /* Reset confirmanswer so DTMF's will behave properly for the duration of the call */
1579  } else {
1580  p->subs[idx].f.frametype = AST_FRAME_NULL;
1581  p->subs[idx].f.subclass.integer = 0;
1582  }
1583  *dest = &p->subs[idx].f;
1584  } else if (p->callwaitcas) {
1585  if (f->frametype == AST_FRAME_DTMF_END) {
1586  if ((f->subclass.integer == 'A') || (f->subclass.integer == 'D')) {
1587  ast_debug(1, "Got some DTMF, but it's for the CAS\n");
1588  p->caller.id.name.str = p->callwait_name;
1589  p->caller.id.number.str = p->callwait_num;
1590  analog_send_callerid(p, 1, &p->caller);
1591  }
1592  if (analog_handles_digit(f)) {
1593  p->callwaitcas = 0;
1594  }
1595  }
1596  p->subs[idx].f.frametype = AST_FRAME_NULL;
1597  p->subs[idx].f.subclass.integer = 0;
1598  *dest = &p->subs[idx].f;
1599  } else {
1600  analog_cb_handle_dtmf(p, ast, idx, dest);
1601  }
1602 }
@ 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:930
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:667
static int analog_handles_digit(struct ast_frame *f)
Definition: sig_analog.c:1537
static int analog_check_confirmanswer(struct analog_pvt *p)
Definition: sig_analog.c:937
unsigned int callwaitcas
TRUE if Call Waiting (CW) CPE Alert Signal (CAS) is being sent.
Definition: sig_analog.h:336

References 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, analog_pvt::caller, analog_pvt::callwait_name, analog_pvt::callwait_num, analog_pvt::callwaitcas, analog_subchannel::f, ast_frame::frametype, ast_party_caller::id, ast_frame_subclass::integer, 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 3715 of file sig_analog.c.

3716 {
3717  int res;
3718  pthread_t threadid;
3719  struct ast_channel *chan;
3720  ast_callid callid = 0;
3721  int callid_created;
3722 
3723  ast_debug(1, "channel (%d) - signaling (%d) - event (%s)\n",
3724  i->channel, i->sig, analog_event2str(event));
3725 
3726  /* Handle an event on a given channel for the monitor thread. */
3727  switch (event) {
3730  if (i->inalarm) {
3731  break;
3732  }
3733  /* Got a ring/answer. What kind of channel are we? */
3734  switch (i->sig) {
3735  case ANALOG_SIG_FXOLS:
3736  case ANALOG_SIG_FXOGS:
3737  case ANALOG_SIG_FXOKS:
3738  res = analog_off_hook(i);
3739  i->fxsoffhookstate = 1;
3740  if (res && (errno == EBUSY)) {
3741  break;
3742  }
3743  callid_created = ast_callid_threadstorage_auto(&callid);
3744 
3745  /* Cancel VMWI spill */
3747 
3748  if (i->immediate) {
3750  /* The channel is immediately up. Start right away */
3753  if (!chan) {
3754  ast_log(LOG_WARNING, "Unable to start PBX on channel %d\n", i->channel);
3756  if (res < 0) {
3757  ast_log(LOG_WARNING, "Unable to play congestion tone on channel %d\n", i->channel);
3758  }
3759  }
3760  } else {
3761  /* Check for callerid, digits, etc */
3763  i->ss_astchan = chan;
3764  if (chan) {
3765  if (analog_has_voicemail(i)) {
3767  } else {
3769  }
3770  if (res < 0)
3771  ast_log(LOG_WARNING, "Unable to play dialtone on channel %d, do you have defaultzone and loadzone defined?\n", i->channel);
3772 
3773  if (ast_pthread_create_detached(&threadid, NULL, __analog_ss_thread, i)) {
3774  ast_log(LOG_WARNING, "Unable to start simple switch thread on channel %d\n", i->channel);
3776  if (res < 0) {
3777  ast_log(LOG_WARNING, "Unable to play congestion tone on channel %d\n", i->channel);
3778  }
3779  ast_hangup(chan);
3780  }
3781  } else
3782  ast_log(LOG_WARNING, "Unable to create channel\n");
3783  }
3785  break;
3786  case ANALOG_SIG_FXSLS:
3787  case ANALOG_SIG_FXSGS:
3788  case ANALOG_SIG_FXSKS:
3790  /* Fall through */
3791  case ANALOG_SIG_EMWINK:
3792  case ANALOG_SIG_FEATD:
3793  case ANALOG_SIG_FEATDMF:
3794  case ANALOG_SIG_FEATDMF_TA:
3795  case ANALOG_SIG_E911:
3796  case ANALOG_SIG_FGC_CAMA:
3797  case ANALOG_SIG_FGC_CAMAMF:
3798  case ANALOG_SIG_FEATB:
3799  case ANALOG_SIG_EM:
3800  case ANALOG_SIG_EM_E1:
3801  case ANALOG_SIG_SFWINK:
3802  case ANALOG_SIG_SF_FEATD:
3803  case ANALOG_SIG_SF_FEATDMF:
3804  case ANALOG_SIG_SF_FEATB:
3805  case ANALOG_SIG_SF:
3806  callid_created = ast_callid_threadstorage_auto(&callid);
3807  /* Check for callerid, digits, etc */
3810  } else {
3812  }
3813  i->ss_astchan = chan;
3814  if (!chan) {
3815  ast_log(LOG_WARNING, "Cannot allocate new structure on channel %d\n", i->channel);
3816  } else if (ast_pthread_create_detached(&threadid, NULL, __analog_ss_thread, i)) {
3817  ast_log(LOG_WARNING, "Unable to start simple switch thread on channel %d\n", i->channel);
3819  if (res < 0) {
3820  ast_log(LOG_WARNING, "Unable to play congestion tone on channel %d\n", i->channel);
3821  }
3822  ast_hangup(chan);
3823  }
3825  break;
3826  default:
3827  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);
3829  if (res < 0) {
3830  ast_log(LOG_WARNING, "Unable to play congestion tone on channel %d\n", i->channel);
3831  }
3832  return NULL;
3833  }
3834  break;
3835  case ANALOG_EVENT_NOALARM:
3836  analog_set_alarm(i, 0);
3838  break;
3839  case ANALOG_EVENT_ALARM:
3840  analog_set_alarm(i, 1);
3842  /* fall thru intentionally */
3843  case ANALOG_EVENT_ONHOOK:
3844  /* Back on hook. Hang up. */
3845  switch (i->sig) {
3846  case ANALOG_SIG_FXOLS:
3847  case ANALOG_SIG_FXOGS:
3848  i->fxsoffhookstate = 0;
3850  /* Fall through */
3851  case ANALOG_SIG_FEATD:
3852  case ANALOG_SIG_FEATDMF:
3853  case ANALOG_SIG_FEATDMF_TA:
3854  case ANALOG_SIG_E911:
3855  case ANALOG_SIG_FGC_CAMA:
3856  case ANALOG_SIG_FGC_CAMAMF:
3857  case ANALOG_SIG_FEATB:
3858  case ANALOG_SIG_EM:
3859  case ANALOG_SIG_EM_E1:
3860  case ANALOG_SIG_EMWINK:
3861  case ANALOG_SIG_SF_FEATD:
3862  case ANALOG_SIG_SF_FEATDMF:
3863  case ANALOG_SIG_SF_FEATB:
3864  case ANALOG_SIG_SF:
3865  case ANALOG_SIG_SFWINK:
3866  case ANALOG_SIG_FXSLS:
3867  case ANALOG_SIG_FXSGS:
3868  case ANALOG_SIG_FXSKS:
3870  res = analog_play_tone(i, ANALOG_SUB_REAL, -1);
3871  analog_on_hook(i);
3872  break;
3873  case ANALOG_SIG_FXOKS:
3874  i->fxsoffhookstate = 0;
3877  /* Diddle the battery for the zhone */
3878 #ifdef ZHONE_HACK
3879  analog_off_hook(i);
3880  usleep(1);
3881 #endif
3882  res = analog_play_tone(i, ANALOG_SUB_REAL, -1);
3883  analog_on_hook(i);
3884  break;
3885  default:
3886  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);
3887  res = analog_play_tone(i, ANALOG_SUB_REAL, -1);
3888  return NULL;
3889  }
3890  break;
3891  case ANALOG_EVENT_POLARITY:
3892  switch (i->sig) {
3893  case ANALOG_SIG_FXSLS:
3894  case ANALOG_SIG_FXSKS:
3895  case ANALOG_SIG_FXSGS:
3896  callid_created = ast_callid_threadstorage_auto(&callid);
3897  /* We have already got a PR before the channel was
3898  created, but it wasn't handled. We need polarity
3899  to be REV for remote hangup detection to work.
3900  At least in Spain */
3901  if (i->hanguponpolarityswitch) {
3902  i->polarity = POLARITY_REV;
3903  }
3905  i->polarity = POLARITY_REV;
3906  ast_verb(2, "Starting post polarity CID detection on channel %d\n",
3907  i->channel);
3909  i->ss_astchan = chan;
3910  if (!chan) {
3911  ast_log(LOG_WARNING, "Cannot allocate new structure on channel %d\n", i->channel);
3912  } else if (ast_pthread_create_detached(&threadid, NULL, __analog_ss_thread, i)) {
3913  ast_log(LOG_WARNING, "Unable to start simple switch thread on channel %d\n", i->channel);
3914  ast_hangup(chan);
3915  }
3916  }
3918  break;
3919  default:
3921  "handle_init_event detected polarity reversal on non-FXO (ANALOG_SIG_FXS) interface %d\n",
3922  i->channel);
3923  break;
3924  }
3925  break;
3926  case ANALOG_EVENT_DTMFCID:
3927  switch (i->sig) {
3928  case ANALOG_SIG_FXSLS:
3929  case ANALOG_SIG_FXSKS:
3930  case ANALOG_SIG_FXSGS:
3931  callid_created = ast_callid_threadstorage_auto(&callid);
3933  ast_verb(2, "Starting DTMF CID detection on channel %d\n",
3934  i->channel);
3936  i->ss_astchan = chan;
3937  if (!chan) {
3938  ast_log(LOG_WARNING, "Cannot allocate new structure on channel %d\n", i->channel);
3939  } else if (ast_pthread_create_detached(&threadid, NULL, __analog_ss_thread, i)) {
3940  ast_log(LOG_WARNING, "Unable to start simple switch thread on channel %d\n", i->channel);
3941  ast_hangup(chan);
3942  }
3943  }
3945  break;
3946  default:
3948  "handle_init_event detected dtmfcid generation event on non-FXO (ANALOG_SIG_FXS) interface %d\n",
3949  i->channel);
3950  break;
3951  }
3952  break;
3953  case ANALOG_EVENT_REMOVED: /* destroy channel, will actually do so in do_monitor */
3954  ast_log(LOG_NOTICE, "Got ANALOG_EVENT_REMOVED. Destroying channel %d\n",
3955  i->channel);
3956  return i->chan_pvt;
3959  break;
3962  break;
3963  }
3964  return NULL;
3965 }
void ast_hangup(struct ast_channel *chan)
Hang up a channel.
Definition: channel.c:2542
@ 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:2123
unsigned int ast_callid
Definition: logger.h:90
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:2101
#define LOG_NOTICE
Definition: logger.h:264
static void analog_publish_channel_alarm_clear(int channel)
Definition: sig_analog.c:2712
static void * __analog_ss_thread(void *data)
Definition: sig_analog.c:1709
static void analog_set_alarm(struct analog_pvt *p, int in_alarm)
Definition: sig_analog.c:898
static int analog_handle_notify_message(struct ast_channel *chan, struct analog_pvt *p, int cid_flags, int neon_mwievent)
Definition: sig_analog.c:1624
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:454
const char * analog_sigtype_to_str(enum analog_sigtype sigtype)
Definition: sig_analog.c:123
static void analog_get_and_handle_alarms(struct analog_pvt *p)
Definition: sig_analog.c:1659
static int analog_has_voicemail(struct analog_pvt *p)
Definition: sig_analog.c:682
static void analog_cancel_cidspill(struct analog_pvt *p)
Definition: sig_analog.c:946
#define POLARITY_REV
Definition: sig_analog.c:63
static void analog_start_polarityswitch(struct analog_pvt *p)
Definition: sig_analog.c:639
unsigned int immediate
Definition: sig_analog.h:290
void * chan_pvt
Definition: sig_analog.h:268
enum analog_cid_start cid_start
Definition: sig_analog.h:315
int ringt_base
Definition: sig_analog.h:361
int fxsoffhookstate
Definition: sig_analog.h:275
unsigned int inalarm
Definition: sig_analog.h:329
int polarity
Definition: sig_analog.h:345
struct ast_channel * ss_astchan
Definition: sig_analog.h:357
Main Channel structure associated with a channel.
Definition: astman.c:222
#define ast_pthread_create_detached(a, b, c, d)
Definition: utils.h:583

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_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::chan_pvt, analog_pvt::channel, analog_pvt::cid_start, errno, analog_pvt::fxsoffhookstate, analog_pvt::hanguponpolarityswitch, analog_pvt::immediate, analog_pvt::inalarm, LOG_NOTICE, LOG_WARNING, NULL, analog_pvt::polarity, POLARITY_REV, analog_pvt::ringt_base, analog_pvt::sig, and analog_pvt::ss_astchan.

Referenced by do_monitor().

◆ analog_hangup()

int analog_hangup ( struct analog_pvt p,
struct ast_channel ast 
)

Definition at line 1249 of file sig_analog.c.

1250 {
1251  int res;
1252  int idx, x;
1253 
1254  ast_debug(1, "%s %d\n", __FUNCTION__, p->channel);
1255  if (!ast_channel_tech_pvt(ast)) {
1256  ast_log(LOG_WARNING, "Asked to hangup channel not connected\n");
1257  return 0;
1258  }
1259 
1260  idx = analog_get_index(ast, p, 1);
1261 
1262  x = 0;
1263  if (p->origcid_num) {
1264  ast_copy_string(p->cid_num, p->origcid_num, sizeof(p->cid_num));
1265  ast_free(p->origcid_num);
1266  p->origcid_num = NULL;
1267  }
1268  if (p->origcid_name) {
1269  ast_copy_string(p->cid_name, p->origcid_name, sizeof(p->cid_name));
1270  ast_free(p->origcid_name);
1271  p->origcid_name = NULL;
1272  }
1273 
1275 
1276  ast_debug(1, "Hangup: channel: %d index = %d, normal = %d, callwait = %d, thirdcall = %d\n",
1278  if (idx > -1) {
1279  /* Real channel, do some fixup */
1280  p->subs[idx].owner = NULL;
1281  p->polarity = POLARITY_IDLE;
1282  analog_set_linear_mode(p, idx, 0);
1283  switch (idx) {
1284  case ANALOG_SUB_REAL:
1286  ast_debug(1, "Normal call hung up with both three way call and a call waiting call in place?\n");
1288  /* We had flipped over to answer a callwait and now it's gone */
1289  ast_debug(1, "We were flipped over to the callwait, moving back and not owning.\n");
1290  /* Move to the call-wait, but un-own us until they flip back. */
1294  } else {
1295  /* The three way hung up, but we still have a call wait */
1296  ast_debug(1, "We were in the threeway and have a callwait still. Ditching the threeway.\n");
1299  if (p->subs[ANALOG_SUB_REAL].inthreeway) {
1300  /* This was part of a three way call. Immediately make way for
1301  another call */
1302  ast_debug(1, "Call was complete, setting owner to former third call\n");
1305  } else {
1306  /* This call hasn't been completed yet... Set owner to NULL */
1307  ast_debug(1, "Call was incomplete, setting owner to NULL\n");
1309  }
1310  }
1311  } else if (p->subs[ANALOG_SUB_CALLWAIT].allocd) {
1312  /* Need to hold the lock for real-call, private, and call-waiting call */
1314  if (!p->subs[ANALOG_SUB_CALLWAIT].owner) {
1315  /* The call waiting call dissappeared. */
1317  break;
1318  }
1319 
1320  /* Move to the call-wait and switch back to them. */
1324  if (ast_channel_state(p->owner) != AST_STATE_UP) {
1326  }
1328  /* Unlock the call-waiting call that we swapped to real-call. */
1330  } else if (p->subs[ANALOG_SUB_THREEWAY].allocd) {
1333  if (p->subs[ANALOG_SUB_REAL].inthreeway) {
1334  /* This was part of a three way call. Immediately make way for
1335  another call */
1336  ast_debug(1, "Call was complete, setting owner to former third call\n");
1339  } else {
1340  /* This call hasn't been completed yet... Set owner to NULL */
1341  ast_debug(1, "Call was incomplete, setting owner to NULL\n");
1343  }
1344  }
1345  break;
1346  case ANALOG_SUB_CALLWAIT:
1347  /* Ditch the holding callwait call, and immediately make it available */
1349  /* Need to hold the lock for call-waiting call, private, and 3-way call */
1351 
1352  /* This is actually part of a three way, placed on hold. Place the third part
1353  on music on hold now */
1354  if (p->subs[ANALOG_SUB_THREEWAY].owner) {
1356  }
1358  /* Make it the call wait now */
1361  if (p->subs[ANALOG_SUB_CALLWAIT].owner) {
1362  /* Unlock the 3-way call that we swapped to call-waiting call. */
1364  }
1365  } else {
1367  }
1368  break;
1369  case ANALOG_SUB_THREEWAY:
1370  /* Need to hold the lock for 3-way call, private, and call-waiting call */
1373  /* The other party of the three way call is currently in a call-wait state.
1374  Start music on hold for them, and take the main guy out of the third call */
1376  if (p->subs[ANALOG_SUB_CALLWAIT].owner) {
1378  }
1379  }
1380  if (p->subs[ANALOG_SUB_CALLWAIT].owner) {
1382  }
1384  /* If this was part of a three way call index, let us make
1385  another three way call */
1387  break;
1388  default:
1389  /*
1390  * Should never happen.
1391  * This wasn't any sort of call, so how are we an index?
1392  */
1393  ast_log(LOG_ERROR, "Index found but not any type of call?\n");
1394  break;
1395  }
1396  }
1397 
1400  analog_set_ringtimeout(p, 0);
1402  analog_set_pulsedial(p, 0);
1403  analog_set_outgoing(p, 0);
1404  p->onhooktime = time(NULL);
1405  p->cidrings = 1;
1406 
1407  /* Perform low level hangup if no owner left */
1408  res = analog_on_hook(p);
1409  if (res < 0) {
1410  ast_log(LOG_WARNING, "Unable to hangup line %s\n", ast_channel_name(ast));
1411  }
1412  switch (p->sig) {
1413  case ANALOG_SIG_FXOGS:
1414  case ANALOG_SIG_FXOLS:
1415  case ANALOG_SIG_FXOKS:
1416  /* If they're off hook, try playing congestion */
1417  if (analog_is_off_hook(p)) {
1420  } else {
1422  }
1423  break;
1424  case ANALOG_SIG_FXSGS:
1425  case ANALOG_SIG_FXSLS:
1426  case ANALOG_SIG_FXSKS:
1427  /* Make sure we're not made available for at least two seconds assuming
1428  we were actually used for an inbound or outbound call. */
1429  if (ast_channel_state(ast) != AST_STATE_RESERVED) {
1430  time(&p->guardtime);
1431  p->guardtime += 2;
1432  }
1433  break;
1434  default:
1436  break;
1437  }
1438 
1440 
1441  x = 0;
1442  ast_channel_setoption(ast,AST_OPTION_TONE_VERIFY,&x,sizeof(char),0);
1443  ast_channel_setoption(ast,AST_OPTION_TDD,&x,sizeof(char),0);
1444  p->callwaitcas = 0;
1447  analog_set_dialing(p, 0);
1448  analog_update_conf(p);
1450  }
1451 
1453 
1454  ast_verb(3, "Hanging up on '%s'\n", ast_channel_name(ast));
1455 
1456  return 0;
1457 }
void * ast_channel_tech_pvt(const struct ast_channel *chan)
int ast_queue_hold(struct ast_channel *chan, const char *musicclass)
Queue a hold frame.
Definition: channel.c:1185
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:7505
#define AST_OPTION_TONE_VERIFY
#define AST_OPTION_TDD
#define LOG_ERROR
Definition: logger.h:286
static int analog_unalloc_sub(struct analog_pvt *p, enum analog_sub x)
Definition: sig_analog.c:381
static int analog_set_linear_mode(struct analog_pvt *p, enum analog_sub sub, int linear_mode)
Definition: sig_analog.c:968
static void analog_hangup_polarityswitch(struct analog_pvt *p)
Definition: sig_analog.c:652
static void analog_lock_sub_owner(struct analog_pvt *pvt, enum analog_sub sub_idx)
Definition: sig_analog.c:599
static int analog_dsp_set_digitmode(struct analog_pvt *p, enum analog_dsp_digitmode mode)
Definition: sig_analog.c:659
static void analog_set_pulsedial(struct analog_pvt *p, int flag)
Definition: sig_analog.c:961
static void analog_set_inthreeway(struct analog_pvt *p, enum analog_sub sub, int inthreeway)
Definition: sig_analog.c:977
#define POLARITY_IDLE
Definition: sig_analog.c:62
static void analog_all_subchannels_hungup(struct analog_pvt *p)
Definition: sig_analog.c:553
char cid_num[AST_MAX_EXTENSION]
Definition: sig_analog.h:317
unsigned int permhidecallerid
Definition: sig_analog.h:292
char * origcid_name
Definition: sig_analog.h:353
char * origcid_num
Definition: sig_analog.h:352
int onhooktime
Definition: sig_analog.h:274
int cidrings
Definition: sig_analog.h:343
unsigned int hidecallerid
Definition: sig_analog.h:327
char cid_name[AST_MAX_EXTENSION]
Definition: sig_analog.h:318
char mohsuggest[MAX_MUSICCLASS]
Definition: sig_analog.h:316

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

3969 {
3970  struct analog_pvt *p;
3971 
3972  p = ast_calloc(1, sizeof(*p));
3973  if (!p) {
3974  return p;
3975  }
3976 
3978  p->sig = signallingtype;
3979  p->chan_pvt = private_data;
3980 
3981  /* Some defaults for values */
3984  /* Sub real is assumed to always be alloc'd */
3985  p->subs[ANALOG_SUB_REAL].allocd = 1;
3986 
3987  return p;
3988 }
#define ast_calloc(num, len)
A wrapper for calloc()
Definition: astmm.h:202
#define CID_SIG_BELL
Definition: callerid.h:59
int cid_signalling
Definition: sig_analog.h:312

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

771 {
772  struct ast_channel *ast;
773 
774  ast_debug(1, "%s %d\n", __FUNCTION__, p->channel);
775  *callwait = (p->owner != NULL);
776 
777  if (p->owner) {
779  ast_log(LOG_ERROR, "Unable to alloc subchannel\n");
780  return NULL;
781  }
782  }
783 
784  analog_set_outgoing(p, 1);
786  p->owner ? ANALOG_SUB_CALLWAIT : ANALOG_SUB_REAL, requestor);
787  if (!ast) {
788  analog_set_outgoing(p, 0);
789  }
790  return ast;
791 }
static int analog_alloc_sub(struct analog_pvt *p, enum analog_sub x)
Definition: sig_analog.c:368

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 @152 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 2705 of file sig_analog.c.

2706 {
2707  pthread_t threadid;
2708 
2709  return ast_pthread_create_detached(&threadid, NULL, __analog_ss_thread, p);
2710 }

References __analog_ss_thread(), ast_pthread_create_detached, and NULL.

Referenced by mwi_thread().

◆ analog_str_to_cidstart()

enum analog_cid_start analog_str_to_cidstart ( const char *  value)

Definition at line 230 of file sig_analog.c.

235 {
236  if (!strcasecmp(value, "ring")) {
237  return ANALOG_CID_START_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

◆ 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 66 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 }

Variable Documentation

◆ analog_callbacks

struct analog_callback analog_callbacks
extern

Global analog callbacks to the upper layer.

Definition at line 3335 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().