aboutsummaryrefslogtreecommitdiffstats
path: root/channels/chan_alsa.c
diff options
context:
space:
mode:
authorkpfleming <kpfleming@f38db490-d61c-443f-a65b-d21fe96a405b>2006-07-19 20:44:39 +0000
committerkpfleming <kpfleming@f38db490-d61c-443f-a65b-d21fe96a405b>2006-07-19 20:44:39 +0000
commit6049bb6539153c2f400f1f2dbc763c74d796204b (patch)
tree3c36781db3a5a7a08967cbe8d83acb5d82e581cb /channels/chan_alsa.c
parent28df168d0f9fd12f5914263015dc26898e834146 (diff)
merge Russell's 'hold_handling' branch, finally implementing music-on-hold handling the way it was decided at AstriDevCon Europe 2006 (and the way people really want it to be)
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@37988 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'channels/chan_alsa.c')
-rw-r--r--channels/chan_alsa.c41
1 files changed, 28 insertions, 13 deletions
diff --git a/channels/chan_alsa.c b/channels/chan_alsa.c
index 5c921b918..aeadc340c 100644
--- a/channels/chan_alsa.c
+++ b/channels/chan_alsa.c
@@ -61,6 +61,7 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
#include "asterisk/endian.h"
#include "asterisk/stringfields.h"
#include "asterisk/abstract_jb.h"
+#include "asterisk/musiconhold.h"
#include "busy.h"
#include "ringtone.h"
@@ -127,6 +128,7 @@ static const char config[] = "alsa.conf";
static char context[AST_MAX_CONTEXT] = "default";
static char language[MAX_LANGUAGE] = "";
static char exten[AST_MAX_EXTENSION] = "s";
+static char mohinterpret[MAX_MUSICCLASS];
static int hookstate=0;
@@ -764,7 +766,9 @@ static int alsa_fixup(struct ast_channel *oldchan, struct ast_channel *newchan)
static int alsa_indicate(struct ast_channel *chan, int cond, const void *data, size_t datalen)
{
int res = 0;
+
ast_mutex_lock(&alsalock);
+
switch(cond) {
case AST_CONTROL_BUSY:
res = 1;
@@ -773,7 +777,6 @@ static int alsa_indicate(struct ast_channel *chan, int cond, const void *data, s
res = 2;
break;
case AST_CONTROL_RINGING:
- res = 0;
break;
case -1:
res = -1;
@@ -781,14 +784,24 @@ static int alsa_indicate(struct ast_channel *chan, int cond, const void *data, s
case AST_CONTROL_VIDUPDATE:
res = -1;
break;
+ case AST_CONTROL_HOLD:
+ ast_verbose( " << Console Has Been Placed on Hold >> \n");
+ ast_moh_start(chan, data, mohinterpret);
+ break;
+ case AST_CONTROL_UNHOLD:
+ ast_verbose( " << Console Has Been Retrieved from Hold >> \n");
+ ast_moh_stop(chan);
+ break;
default:
ast_log(LOG_WARNING, "Don't know how to display condition %d on %s\n", cond, chan->name);
res = -1;
}
- if (res > -1) {
+
+ if (res > -1)
write(sndcmd[1], &res, sizeof(res));
- }
+
ast_mutex_unlock(&alsalock);
+
return res;
}
@@ -1068,14 +1081,15 @@ static int load_module(void *mod)
/* Copy the default jb config over global_jbconf */
memcpy(&global_jbconf, &default_jbconf, sizeof(struct ast_jb_conf));
+ strcpy(mohinterpret, "default");
+
if ((cfg = ast_config_load(config))) {
v = ast_variable_browse(cfg, "general");
- while(v) {
+ for (; v; v = v->next) {
/* handle jb conf */
- if (!ast_jb_read_conf(&global_jbconf, v->name, v->value)) {
- v = v->next;
+ if (!ast_jb_read_conf(&global_jbconf, v->name, v->value))
continue;
- }
+
if (!strcasecmp(v->name, "autoanswer"))
autoanswer = ast_true(v->value);
else if (!strcasecmp(v->name, "silencesuppression"))
@@ -1083,16 +1097,17 @@ static int load_module(void *mod)
else if (!strcasecmp(v->name, "silencethreshold"))
silencethreshold = atoi(v->value);
else if (!strcasecmp(v->name, "context"))
- strncpy(context, v->value, sizeof(context)-1);
+ ast_copy_string(context, v->value, sizeof(context));
else if (!strcasecmp(v->name, "language"))
- strncpy(language, v->value, sizeof(language)-1);
+ ast_copy_string(language, v->value, sizeof(language));
else if (!strcasecmp(v->name, "extension"))
- strncpy(exten, v->value, sizeof(exten)-1);
+ ast_copy_string(exten, v->value, sizeof(exten));
else if (!strcasecmp(v->name, "input_device"))
- strncpy(indevname, v->value, sizeof(indevname)-1);
+ ast_copy_string(indevname, v->value, sizeof(indevname));
else if (!strcasecmp(v->name, "output_device"))
- strncpy(outdevname, v->value, sizeof(outdevname)-1);
- v=v->next;
+ ast_copy_string(outdevname, v->value, sizeof(outdevname));
+ else if (!strcasecmp(v->name, "mohinterpret"))
+ ast_copy_string(mohinterpret, v->value, sizeof(mohinterpret));
}
ast_config_destroy(cfg);
}