MOH for only user not working with ConfBridge
[asterisk/asterisk.git] / apps / confbridge / include / confbridge.h
1 /*
2  * Asterisk -- An open source telephony toolkit.
3  *
4  * Copyright (C) 2011, Digium, Inc.
5  *
6  * David Vossel <dvossel@digium.com>
7  * Joshua Colp <jcolp@digium.com>
8  *
9  * See http://www.asterisk.org for more information about
10  * the Asterisk project. Please do not directly contact
11  * any of the maintainers of this project for assistance;
12  * the project provides a web site, mailing lists and IRC
13  * channels for your use.
14  *
15  * This program is free software, distributed under the terms of
16  * the GNU General Public License Version 2. See the LICENSE file
17  * at the top of the source tree.
18  */
19
20
21 #ifndef _CONFBRIDGE_H
22 #define _CONFBRIDGE_H
23
24 #include "asterisk.h"
25 #include "asterisk/app.h"
26 #include "asterisk/logger.h"
27 #include "asterisk/linkedlists.h"
28 #include "asterisk/channel.h"
29 #include "asterisk/bridging.h"
30 #include "asterisk/bridging_features.h"
31
32 /* Maximum length of a conference bridge name */
33 #define MAX_CONF_NAME 32
34 /* Maximum length of a conference pin */
35 #define MAX_PIN     80
36
37 #define DEFAULT_USER_PROFILE "default_user"
38 #define DEFAULT_BRIDGE_PROFILE "default_bridge"
39
40 #define DEFAULT_TALKING_THRESHOLD 160
41 #define DEFAULT_SILENCE_THRESHOLD 2500
42
43 enum user_profile_flags {
44         USER_OPT_ADMIN =        (1 << 0), /*!< Set if the caller is an administrator */
45         USER_OPT_NOONLYPERSON = (1 << 1), /*!< Set if the "you are currently the only person in this conference" sound file should not be played */
46         USER_OPT_MARKEDUSER =   (1 << 2), /*!< Set if the caller is a marked user */
47         USER_OPT_STARTMUTED =   (1 << 3), /*!< Set if the caller should be initially set muted */
48         USER_OPT_MUSICONHOLD =  (1 << 4), /*!< Set if music on hold should be played if nobody else is in the conference bridge */
49         USER_OPT_QUIET =        (1 << 5), /*!< Set if no audio prompts should be played */
50         USER_OPT_ANNOUNCEUSERCOUNT = (1 << 6), /*!< Set if the number of users should be announced to the caller */
51         USER_OPT_WAITMARKED =   (1 << 7), /*!< Set if the user must wait for a marked user before starting */
52         USER_OPT_ENDMARKED =    (1 << 8), /*!< Set if the user should be kicked after the last Marked user exits */
53         USER_OPT_DENOISE =      (1 << 9), /*!< Sets if denoise filter should be used on audio before mixing. */
54         USER_OPT_ANNOUNCE_JOIN_LEAVE = (1 << 10), /*!< Sets if the user's name should be recorded and announced on join and leave. */
55         USER_OPT_TALKER_DETECT = (1 << 11), /*!< Sets if start and stop talking events should generated for this user over AMI. */
56         USER_OPT_DROP_SILENCE =  (1 << 12), /*!< Sets if silence should be dropped from the mix or not. */
57         USER_OPT_DTMF_PASS    =  (1 << 13), /*!< Sets if dtmf should be passed into the conference or not */
58         USER_OPT_ANNOUNCEUSERCOUNTALL = (1 << 14), /*!< Sets if the number of users should be announced to everyone. */
59         USER_OPT_JITTERBUFFER =  (1 << 15), /*!< Places a jitterbuffer on the user. */
60 };
61
62 enum bridge_profile_flags {
63         BRIDGE_OPT_RECORD_CONFERENCE = (1 << 0), /*!< Set if the conference should be recorded */
64 };
65
66 enum conf_menu_action_id {
67         MENU_ACTION_TOGGLE_MUTE = 1,
68         MENU_ACTION_PLAYBACK,
69         MENU_ACTION_PLAYBACK_AND_CONTINUE,
70         MENU_ACTION_INCREASE_LISTENING,
71         MENU_ACTION_DECREASE_LISTENING,
72         MENU_ACTION_RESET_LISTENING,
73         MENU_ACTION_RESET_TALKING,
74         MENU_ACTION_INCREASE_TALKING,
75         MENU_ACTION_DECREASE_TALKING,
76         MENU_ACTION_DIALPLAN_EXEC,
77         MENU_ACTION_ADMIN_TOGGLE_LOCK,
78         MENU_ACTION_ADMIN_KICK_LAST,
79         MENU_ACTION_LEAVE,
80         MENU_ACTION_NOOP,
81 };
82
83 /*! The conference menu action contains both
84  *  the action id that represents the action that
85  *  must take place, along with any data associated
86  *  with that action. */
87 struct conf_menu_action {
88         enum conf_menu_action_id id;
89         union {
90                 char playback_file[PATH_MAX];
91                 struct {
92                         char context[AST_MAX_CONTEXT];
93                         char exten[AST_MAX_EXTENSION];
94                         int priority;
95                 } dialplan_args;
96         } data;
97         AST_LIST_ENTRY(conf_menu_action) action;
98 };
99
100 /*! Conference menu entries contain the DTMF sequence
101  *  and the list of actions that are associated with that
102  *  sequence. */
103 struct conf_menu_entry {
104         /*! the DTMF sequence that triggers the actions */
105         char dtmf[MAXIMUM_DTMF_FEATURE_STRING];
106         /*! The actions associated with this menu entry. */
107         AST_LIST_HEAD_NOLOCK(, conf_menu_action) actions;
108         AST_LIST_ENTRY(conf_menu_entry) entry;
109 };
110
111 /*! Conference menu structure.  Contains a list
112  * of DTMF sequences coupled with the actions those
113  * sequences invoke.*/
114 struct conf_menu {
115         char name[128];
116         int delme;
117         AST_LIST_HEAD_NOLOCK(, conf_menu_entry) entries;
118 };
119
120 struct user_profile {
121         char name[128];
122         char pin[MAX_PIN];
123         char moh_class[128];
124         unsigned int flags;
125         unsigned int announce_user_count_all_after;
126         /*! The time in ms of talking before a user is considered to be talking by the dsp. */
127         unsigned int talking_threshold;
128         /*! The time in ms of silence before a user is considered to be silent by the dsp. */
129         unsigned int silence_threshold;
130         int delme;
131 };
132
133 enum conf_sounds {
134         CONF_SOUND_HAS_JOINED,
135         CONF_SOUND_HAS_LEFT,
136         CONF_SOUND_KICKED,
137         CONF_SOUND_MUTED,
138         CONF_SOUND_UNMUTED,
139         CONF_SOUND_ONLY_ONE,
140         CONF_SOUND_THERE_ARE,
141         CONF_SOUND_OTHER_IN_PARTY,
142         CONF_SOUND_PLACE_IN_CONF,
143         CONF_SOUND_WAIT_FOR_LEADER,
144         CONF_SOUND_LEADER_HAS_LEFT,
145         CONF_SOUND_GET_PIN,
146         CONF_SOUND_INVALID_PIN,
147         CONF_SOUND_ONLY_PERSON,
148         CONF_SOUND_LOCKED,
149         CONF_SOUND_LOCKED_NOW,
150         CONF_SOUND_UNLOCKED_NOW,
151         CONF_SOUND_ERROR_MENU,
152         CONF_SOUND_JOIN,
153         CONF_SOUND_LEAVE,
154 };
155
156 struct bridge_profile_sounds {
157         AST_DECLARE_STRING_FIELDS(
158                 AST_STRING_FIELD(hasjoin);
159                 AST_STRING_FIELD(hasleft);
160                 AST_STRING_FIELD(kicked);
161                 AST_STRING_FIELD(muted);
162                 AST_STRING_FIELD(unmuted);
163                 AST_STRING_FIELD(onlyone);
164                 AST_STRING_FIELD(thereare);
165                 AST_STRING_FIELD(otherinparty);
166                 AST_STRING_FIELD(placeintoconf);
167                 AST_STRING_FIELD(waitforleader);
168                 AST_STRING_FIELD(leaderhasleft);
169                 AST_STRING_FIELD(getpin);
170                 AST_STRING_FIELD(invalidpin);
171                 AST_STRING_FIELD(onlyperson);
172                 AST_STRING_FIELD(locked);
173                 AST_STRING_FIELD(lockednow);
174                 AST_STRING_FIELD(unlockednow);
175                 AST_STRING_FIELD(errormenu);
176                 AST_STRING_FIELD(leave);
177                 AST_STRING_FIELD(join);
178         );
179 };
180
181 struct bridge_profile {
182         char name[64];
183         char rec_file[PATH_MAX];
184         unsigned int flags;
185         unsigned int max_members;          /*!< The maximum number of participants allowed in the conference */
186         unsigned int internal_sample_rate; /*!< The internal sample rate of the bridge. 0 when set to auto adjust mode. */
187         unsigned int mix_interval;  /*!< The internal mixing interval used by the bridge. When set to 0 the bridgewill use a default interval. */
188         struct bridge_profile_sounds *sounds;
189         int delme;
190 };
191
192 /*! \brief The structure that represents a conference bridge */
193 struct conference_bridge {
194         char name[MAX_CONF_NAME];                                         /*!< Name of the conference bridge */
195         struct ast_bridge *bridge;                                        /*!< Bridge structure doing the mixing */
196         struct bridge_profile b_profile;                                  /*!< The Bridge Configuration Profile */
197         unsigned int users;                                               /*!< Number of users present */
198         unsigned int markedusers;                                         /*!< Number of marked users present */
199         unsigned int locked:1;                                            /*!< Is this conference bridge locked? */
200         struct ast_channel *playback_chan;                                /*!< Channel used for playback into the conference bridge */
201         struct ast_channel *record_chan;                                  /*!< Channel used for recording the conference */
202         pthread_t record_thread;                                          /*!< The thread the recording chan lives in */
203         ast_mutex_t playback_lock;                                        /*!< Lock used for playback channel */
204         AST_LIST_HEAD_NOLOCK(, conference_bridge_user) users_list;        /*!< List of users participating in the conference bridge */
205 };
206
207 /*! \brief The structure that represents a conference bridge user */
208 struct conference_bridge_user {
209         struct conference_bridge *conference_bridge; /*!< Conference bridge they are participating in */
210         struct bridge_profile b_profile;             /*!< The Bridge Configuration Profile */
211         struct user_profile u_profile;               /*!< The User Configuration Profile */
212         char menu_name[64];                          /*!< The name of the DTMF menu assigned to this user */
213         char name_rec_location[PATH_MAX];            /*!< Location of the User's name recorded file if it exists */
214         struct ast_channel *chan;                    /*!< Asterisk channel participating */
215         struct ast_bridge_features features;         /*!< Bridge features structure */
216         struct ast_bridge_tech_optimizations tech_args; /*!< Bridge technology optimizations for talk detection */
217         unsigned int kicked:1;                       /*!< User has been kicked from the conference */
218         unsigned int playing_moh:1;                  /*!< MOH is currently being played to the user */
219         AST_LIST_ENTRY(conference_bridge_user) list; /*!< Linked list information */
220 };
221
222 /*! \brief load confbridge.conf file */
223 int conf_load_config(int reload);
224
225 /*! \brief destroy the information loaded from the confbridge.conf file*/
226 void conf_destroy_config(void);
227
228 /*!
229  * \brief find a user profile given a user profile's name and store
230  * that profile in result structure.
231  *
232  * \details This function first attempts to find any custom user
233  * profile that might exist on a channel datastore, if that doesn't
234  * exist it looks up the provided user profile name, if that doesn't
235  * exist either the default_user profile is used.
236
237  * \retval user profile on success
238  * \retval NULL on failure
239  */
240 const struct user_profile *conf_find_user_profile(struct ast_channel *chan, const char *user_profile_name, struct user_profile *result);
241
242 /*!
243  * \brief Find a bridge profile
244  *
245  * \details Any bridge profile found using this function must be
246  * destroyed using conf_bridge_profile_destroy.  This function first
247  * attempts to find any custom bridge profile that might exist on
248  * a channel datastore, if that doesn't exist it looks up the
249  * provided bridge profile name, if that doesn't exist either
250  * the default_bridge profile is used.
251  *
252  * \retval Bridge profile on success
253  * \retval NULL on failure
254  */
255 const struct bridge_profile *conf_find_bridge_profile(struct ast_channel *chan, const char *bridge_profile_name, struct bridge_profile *result);
256
257 /*!
258  * \brief Destroy a bridge profile found by 'conf_find_bridge_profile'
259  */
260 void conf_bridge_profile_destroy(struct bridge_profile *b_profile);
261
262 /*!
263  * \brief copies a bridge profile
264  * \note conf_bridge_profile_destroy must be called on the dst structure
265  */
266 void conf_bridge_profile_copy(struct bridge_profile *dst, struct bridge_profile *src);
267
268 /*!
269  * \brief Set a DTMF menu to a conference user by menu name.
270  *
271  * \retval 0 on success, menu was found and set
272  * \retval -1 on error, menu was not found
273  */
274 int conf_set_menu_to_user(const char *menu_name, struct conference_bridge_user *conference_bridge_user);
275
276 /*!
277  * \brief Finds a menu_entry in a menu structure matched by DTMF sequence.
278  *
279  * \note the menu entry found must be destroyed using conf_menu_entry_destroy()
280  *
281  * \retval 1 success, entry is found and stored in result
282  * \retval 0 failure, no entry found for given DTMF sequence
283  */
284 int conf_find_menu_entry_by_sequence(const char *dtmf_sequence, struct conf_menu *menu, struct conf_menu_entry *result);
285
286 /*!
287  * \brief Destroys and frees all the actions stored in a menu_entry structure
288  */
289 void conf_menu_entry_destroy(struct conf_menu_entry *menu_entry);
290
291 /*!
292  * \brief Once a DTMF sequence matches a sequence in the user's DTMF menu, this function will get
293  * called to perform the menu action.
294  *
295  * \param bridge_channel, Bridged channel this is involving
296  * \param conference_bridge_user, the conference user to perform the action on.
297  * \param menu_entry, the menu entry that invoked this callback to occur.
298  * \param menu, an AO2 referenced pointer to the entire menu structure the menu_entry
299  *        derived from.
300  *
301  * \note The menu_entry is a deep copy of the entry found in the menu structure.  This allows
302  * for the menu_entry to be accessed without requiring the menu lock.  If the menu must
303  * be accessed, the menu lock must be held.  Reference counting of the menu structure is
304  * handled outside of the scope of this function.
305  *
306  * \retval 0 success
307  * \retval -1 failure
308  */
309 int conf_handle_dtmf(
310         struct ast_bridge_channel *bridge_channel,
311         struct conference_bridge_user *conference_bridge_user,
312         struct conf_menu_entry *menu_entry,
313         struct conf_menu *menu);
314
315
316 /*! \brief Looks to see if sound file is stored in bridge profile sounds, if not
317  *  default sound is provided.*/
318 const char *conf_get_sound(enum conf_sounds sound, struct bridge_profile_sounds *custom_sounds);
319
320 int func_confbridge_helper(struct ast_channel *chan, const char *cmd, char *data, const char *value);
321 #endif