b937ec665a6cfce898a03b06601f28f22a51a81a
[asterisk/asterisk.git] / channels / sig_analog.h
1 #ifndef _SIG_ANALOG_H
2 #define _SIG_ANALOG_H
3 /*
4  * Asterisk -- An open source telephony toolkit.
5  *
6  * Copyright (C) 1999 - 2009, Digium, Inc.
7  *
8  * Mark Spencer <markster@digium.com>
9  *
10  * See http://www.asterisk.org for more information about
11  * the Asterisk project. Please do not directly contact
12  * any of the maintainers of this project for assistance;
13  * the project provides a web site, mailing lists and IRC
14  * channels for your use.
15  *
16  * This program is free software, distributed under the terms of
17  * the GNU General Public License Version 2. See the LICENSE file
18  * at the top of the source tree.
19  */
20
21 /*! \file
22  *
23  * \brief Interface header for analog signaling module
24  *
25  * \author Matthew Fredrickson <creslin@digium.com>
26  */
27
28 #include "asterisk/channel.h"
29 #include "asterisk/frame.h"
30
31 /* Signalling types supported */
32 enum analog_sigtype {
33         ANALOG_SIG_NONE = -1,
34         ANALOG_SIG_FXOLS = 1,
35         ANALOG_SIG_FXOKS,
36         ANALOG_SIG_FXOGS,
37         ANALOG_SIG_FXSLS,
38         ANALOG_SIG_FXSKS,
39         ANALOG_SIG_FXSGS,
40         ANALOG_SIG_EMWINK,
41         ANALOG_SIG_EM,
42         ANALOG_SIG_EM_E1,
43         ANALOG_SIG_FEATD,
44         ANALOG_SIG_FEATDMF,
45         ANALOG_SIG_E911,
46         ANALOG_SIG_FGC_CAMA,
47         ANALOG_SIG_FGC_CAMAMF,
48         ANALOG_SIG_FEATB,
49         ANALOG_SIG_SFWINK,
50         ANALOG_SIG_SF,
51         ANALOG_SIG_SF_FEATD,
52         ANALOG_SIG_SF_FEATDMF,
53         ANALOG_SIG_FEATDMF_TA,
54         ANALOG_SIG_SF_FEATB,
55 };
56
57 enum analog_tone {
58         ANALOG_TONE_RINGTONE = 0,
59         ANALOG_TONE_STUTTER,
60         ANALOG_TONE_CONGESTION,
61         ANALOG_TONE_DIALTONE,
62         ANALOG_TONE_DIALRECALL,
63         ANALOG_TONE_INFO,
64 };
65
66 enum analog_event {
67         ANALOG_EVENT_NONE = 0,
68         ANALOG_EVENT_DIALCOMPLETE,
69         ANALOG_EVENT_WINKFLASH,
70         ANALOG_EVENT_ONHOOK,
71         ANALOG_EVENT_RINGOFFHOOK,
72         ANALOG_EVENT_ALARM,
73         ANALOG_EVENT_NOALARM,
74         ANALOG_EVENT_HOOKCOMPLETE,
75         ANALOG_EVENT_POLARITY,
76         ANALOG_EVENT_RINGERON,
77         ANALOG_EVENT_RINGEROFF,
78         ANALOG_EVENT_RINGBEGIN,
79         ANALOG_EVENT_PULSE_START,
80         ANALOG_EVENT_ERROR,
81         ANALOG_EVENT_NEONMWI_ACTIVE,
82         ANALOG_EVENT_NEONMWI_INACTIVE,
83         ANALOG_EVENT_DTMFCID,
84 };
85
86 enum analog_sub {
87         ANALOG_SUB_REAL = 0,                    /*!< Active call */
88         ANALOG_SUB_CALLWAIT,                    /*!< Call-Waiting call on hold */
89         ANALOG_SUB_THREEWAY,                    /*!< Three-way call */
90 };
91
92 enum analog_dsp_digitmode {
93         ANALOG_DIGITMODE_DTMF = 1,
94         ANALOG_DIGITMODE_MF,
95 };
96
97 enum analog_cid_start {
98         ANALOG_CID_START_POLARITY = 1,
99         ANALOG_CID_START_POLARITY_IN,
100         ANALOG_CID_START_RING,
101         ANALOG_CID_START_DTMF_NOALERT,
102 };
103
104 #define ANALOG_MAX_CID 300
105
106 enum dialop {
107         ANALOG_DIAL_OP_REPLACE = 2,
108 };
109
110
111 struct analog_dialoperation {
112         enum dialop op;
113         char dialstr[256];
114 };
115
116 struct analog_callback {
117         /* Unlock the private in the signalling private structure.  This is used for three way calling madness. */
118         void (* const unlock_private)(void *pvt);
119         /* Lock the private in the signalling private structure.  ... */
120         void (* const lock_private)(void *pvt);
121         /* Function which is called back to handle any other DTMF up events that are received.  Called by analog_handle_event.  Why is this
122          * important to use, instead of just directly using events received before they are passed into the library?  Because sometimes,
123          * (CWCID) the library absorbs DTMF events received. */
124         void (* const handle_dtmfup)(void *pvt, struct ast_channel *ast, enum analog_sub analog_index, struct ast_frame **dest);
125
126         int (* const get_event)(void *pvt);
127         int (* const wait_event)(void *pvt);
128         int (* const is_off_hook)(void *pvt);
129         int (* const is_dialing)(void *pvt, enum analog_sub sub);
130         /* Start a trunk type signalling protocol (everything except phone ports basically */
131         int (* const start)(void *pvt);
132         int (* const ring)(void *pvt);
133         int (* const flash)(void *pvt);
134         /*! \brief Set channel on hook */
135         int (* const on_hook)(void *pvt);
136         /*! \brief Set channel off hook */
137         int (* const off_hook)(void *pvt);
138         /* We're assuming that we're going to only wink on ANALOG_SUB_REAL - even though in the code there's an argument to the index
139          * function */
140         int (* const wink)(void *pvt, enum analog_sub sub);
141         int (* const dial_digits)(void *pvt, enum analog_sub sub, struct analog_dialoperation *dop);
142         int (* const send_fsk)(void *pvt, struct ast_channel *ast, char *fsk);
143         int (* const play_tone)(void *pvt, enum analog_sub sub, enum analog_tone tone);
144
145         int (* const set_echocanceller)(void *pvt, int enable);
146         int (* const train_echocanceller)(void *pvt);
147         int (* const dsp_set_digitmode)(void *pvt, enum analog_dsp_digitmode mode);
148         int (* const dsp_reset_and_flush_digits)(void *pvt);
149         int (* const send_callerid)(void *pvt, int cwcid, struct ast_callerid *cid);
150         /* Returns 0 if CID received.  Returns 1 if event received, and -1 if error.  name and num are size ANALOG_MAX_CID */
151         int (* const get_callerid)(void *pvt, char *name, char *num, enum analog_event *ev, size_t timeout);
152         /* Start CID detection */
153         int (* const start_cid_detect)(void *pvt, int cid_signalling);
154         /* Stop CID detection */
155         int (* const stop_cid_detect)(void *pvt);
156
157         /* Play the CAS callwait tone on the REAL sub, then repeat after 10 seconds, and then stop */
158         int (* const callwait)(void *pvt);
159         /* Stop playing any CAS call waiting announcement tones that might be running on the REAL sub */
160         int (* const stop_callwait)(void *pvt);
161
162         /* Bearer control related (non signalling) callbacks */
163         int (* const allocate_sub)(void *pvt, enum analog_sub sub);
164         int (* const unallocate_sub)(void *pvt, enum analog_sub sub);
165         /*! This function is for swapping of the owners with the underlying subs.  Typically it means you need to change the fds
166          * of the new owner to be the fds of the sub specified, for each of the two subs given */
167         void (* const swap_subs)(void *pvt, enum analog_sub a, struct ast_channel *new_a_owner, enum analog_sub b, struct ast_channel *new_b_owner);
168         struct ast_channel * (* const new_ast_channel)(void *pvt, int state, int startpbx, enum analog_sub sub, const struct ast_channel *requestor);
169
170         /* Add the given sub to a conference */
171         int (* const conf_add)(void *pvt, enum analog_sub sub);
172         /* Delete the given sub from any conference that might be running on the channels */
173         int (* const conf_del)(void *pvt, enum analog_sub sub);
174
175         /* If you would like to do any optimizations after the conference members have been added and removed,
176          * you can do so here */
177         int (* const complete_conference_update)(void *pvt, int needconf);
178
179         /* This is called when there are no more subchannels on the given private that are left up,
180          * for any cleanup or whatever else you would like to do.  Called from analog_hangup() */
181         void (* const all_subchannels_hungup)(void *pvt);
182
183         int (* const has_voicemail)(void *pvt);
184         int (* const check_for_conference)(void *pvt);
185         void (* const handle_notify_message)(struct ast_channel *chan, void *pvt, int cid_flags, int neon_mwievent);
186
187         /* callbacks for increasing and decreasing ss_thread_count, will handle locking and condition signal */
188         void (* const increase_ss_count)(void);
189         void (* const decrease_ss_count)(void);
190
191         int (* const distinctive_ring)(struct ast_channel *chan, void *pvt, int idx, int *ringdata);
192         /* Sets the specified sub-channel in and out of signed linear mode, returns the value that was overwritten */
193         int (* const set_linear_mode)(void *pvt, int idx, int linear_mode);
194         void (* const get_and_handle_alarms)(void *pvt);
195         void * (* const get_sigpvt_bridged_channel)(struct ast_channel *chan);
196         int (* const get_sub_fd)(void *pvt, enum analog_sub sub);
197         void (* const set_cadence)(void *pvt, int *cidrings, struct ast_channel *chan);
198         void (* const set_dialing)(void *pvt, int flag);
199         void (* const set_ringtimeout)(void *pvt, int ringt);
200         void (* const set_waitingfordt)(void *pvt, struct ast_channel *ast);
201         int (* const check_waitingfordt)(void *pvt);
202         void (* const set_confirmanswer)(void *pvt, int flag);
203         int (* const check_confirmanswer)(void *pvt);
204 };
205
206
207
208 #define READ_SIZE 160
209
210 struct analog_subchannel {
211         struct ast_channel *owner;
212         struct ast_frame f;             /*!< One frame for each channel.  How did this ever work before? */
213         unsigned int inthreeway:1;
214         /* Have we allocated a subchannel yet or not */
215         unsigned int allocd:1;
216 };
217
218 struct analog_pvt {
219         /* Analog signalling type used in this private */
220         enum analog_sigtype sig;
221         /* To contain the private structure passed into the channel callbacks */
222         void *chan_pvt;
223         /* Callbacks for various functions needed by the analog API */
224         struct analog_callback *calls;
225         /* All members after this are giong to be transient, and most will probably change */
226         struct ast_channel *owner;                      /*!< Our current active owner (if applicable) */
227
228         struct analog_subchannel subs[3];               /*!< Sub-channels */
229         struct analog_dialoperation dop;
230         int onhooktime;                                                 /*< Time the interface went on-hook. */
231         int fxsoffhookstate;                                    /*< TRUE if the FXS port is off-hook */
232         /*! \brief -1 = unknown, 0 = no messages, 1 = new messages available */
233         int msgstate;
234
235         /* XXX: Option Variables - Set by allocator of private structure */
236         unsigned int answeronpolarityswitch:1;
237         unsigned int callreturn:1;
238         unsigned int cancallforward:1;
239         unsigned int canpark:1;
240         unsigned int dahditrcallerid:1;                 /*!< should we use the callerid from incoming call on dahdi transfer or not */
241         unsigned int hanguponpolarityswitch:1;
242         unsigned int immediate:1;
243         unsigned int permcallwaiting:1;
244         unsigned int permhidecallerid:1;                /*!< Whether to hide our outgoing caller ID or not */
245         unsigned int pulse:1;
246         unsigned int threewaycalling:1;
247         unsigned int transfer:1;
248         unsigned int transfertobusy:1;                  /*!< allow flash-transfers to busy channels */
249         unsigned int use_callerid:1;                    /*!< Whether or not to use caller id on this channel */
250         const struct ast_channel_tech *chan_tech;
251         /*!
252      * \brief TRUE if distinctive rings are to be detected.
253      * \note For FXO lines
254      * \note Set indirectly from the "usedistinctiveringdetection" value read in from chan_dahdi.conf
255      */
256         unsigned int usedistinctiveringdetection:1;
257
258         /* Not used for anything but log messages.  Could be just the TCID */
259         int channel;                                    /*!< Channel Number */
260         enum analog_sigtype outsigmod;
261         int echotraining;
262         int cid_signalling;                             /*!< Asterisk callerid type we're using */
263         int polarityonanswerdelay;
264         int stripmsd;
265         enum analog_cid_start cid_start;
266         int callwaitingcallerid;
267         char mohsuggest[MAX_MUSICCLASS];
268         char cid_num[AST_MAX_EXTENSION];
269         char cid_name[AST_MAX_EXTENSION];
270
271
272         /* XXX: All variables after this are internal */
273         unsigned int callwaiting:1;
274         unsigned int dialednone:1;
275         unsigned int dialing:1;                 /*!< TRUE if in the process of dialing digits or sending something */
276         unsigned int dnd:1;
277         unsigned int echobreak:1;
278         unsigned int hidecallerid:1;
279         unsigned int outgoing:1;
280         unsigned int pulsedial:1;               /*!< TRUE if a pulsed digit was detected. (Pulse dial phone detected) */
281
282         char callwait_num[AST_MAX_EXTENSION];
283         char callwait_name[AST_MAX_EXTENSION];
284         char lastcid_num[AST_MAX_EXTENSION];
285         char lastcid_name[AST_MAX_EXTENSION];
286         struct ast_callerid cid;
287         int cidrings;                                   /*!< Which ring to deliver CID on */
288         char echorest[20];
289         int polarity;
290         struct timeval polaritydelaytv;
291         char dialdest[256];
292         time_t guardtime;                               /*!< Must wait this much time before using for new call */
293         struct timeval flashtime;                       /*!< Last flash-hook time */
294         int whichwink;                                  /*!< SIG_FEATDMF_TA Which wink are we on? */
295         char finaldial[64];
296         char *origcid_num;                              /*!< malloced original callerid */
297         char *origcid_name;                             /*!< malloced original callerid */
298         char call_forward[AST_MAX_EXTENSION];
299
300         /* Ast channel to pass to __ss_analog_thread */
301         struct ast_channel *ss_astchan;
302
303         /* All variables after this are definitely going to be audited */
304         unsigned int inalarm:1;
305         unsigned int unknown_alarm:1;
306
307         int callwaitcas;
308
309         int ringt;
310         int ringt_base;
311 };
312
313 struct analog_pvt * analog_new(enum analog_sigtype signallingtype, struct analog_callback *c, void *private_data);
314
315 void analog_free(struct analog_pvt *p);
316
317 int analog_call(struct analog_pvt *p, struct ast_channel *ast, char *rdest, int timeout);
318
319 int analog_hangup(struct analog_pvt *p, struct ast_channel *ast);
320
321 int analog_answer(struct analog_pvt *p, struct ast_channel *ast);
322
323 struct ast_frame *analog_exception(struct analog_pvt *p, struct ast_channel *ast);
324
325 struct ast_channel * analog_request(struct analog_pvt *p, int *callwait, const struct ast_channel *requestor);
326
327 int analog_available(struct analog_pvt *p, int channelmatch, ast_group_t groupmatch, int *busy, int *channelmatched, int *groupmatched);
328
329 int analog_handle_init_event(struct analog_pvt *i, int event);
330
331 int analog_config_complete(struct analog_pvt *p);
332
333 void analog_handle_dtmfup(struct analog_pvt *p, struct ast_channel *ast, enum analog_sub index, struct ast_frame **dest);
334
335 enum analog_cid_start analog_str_to_cidstart(const char *value);
336
337 const char *analog_cidstart_to_str(enum analog_cid_start cid_start);
338
339 enum analog_sigtype analog_str_to_sigtype(const char *name);
340
341 const char *analog_sigtype_to_str(enum analog_sigtype sigtype);
342
343 unsigned int analog_str_to_cidtype(const char *name);
344
345 const char *analog_cidtype_to_str(unsigned int cid_type);
346
347 int analog_ss_thread_start(struct analog_pvt *p, struct ast_channel *ast);
348
349 int analog_fixup(struct ast_channel *oldchan, struct ast_channel *newchan, void *newp);
350
351 #endif /* _SIG_ANSLOG_H */