Update chan_phone to indicate FLASH properley (#4935)
authorMatthew Fredrickson <creslin@digium.com>
Tue, 10 Jan 2006 21:34:04 +0000 (21:34 +0000)
committerMatthew Fredrickson <creslin@digium.com>
Tue, 10 Jan 2006 21:34:04 +0000 (21:34 +0000)
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@7947 65c4cc65-6c06-0410-ace0-fbb531ad65f3

channels/chan_phone.c

index abea80c..8f732e9 100644 (file)
@@ -160,6 +160,7 @@ static int phone_write(struct ast_channel *ast, struct ast_frame *frame);
 static struct ast_frame *phone_exception(struct ast_channel *ast);
 static int phone_send_text(struct ast_channel *ast, const char *text);
 static int phone_fixup(struct ast_channel *old, struct ast_channel *new);
+static int phone_indicate(struct ast_channel *chan, int condition);
 
 static const struct ast_channel_tech phone_tech = {
        .type = type,
@@ -173,6 +174,7 @@ static const struct ast_channel_tech phone_tech = {
        .read = phone_read,
        .write = phone_write,
        .exception = phone_exception,
+       .indicate = phone_indicate,
        .fixup = phone_fixup
 };
 
@@ -189,11 +191,31 @@ static struct ast_channel_tech phone_tech_fxs = {
        .exception = phone_exception,
        .write_video = phone_write,
        .send_text = phone_send_text,
+       .indicate = phone_indicate,
        .fixup = phone_fixup
 };
 
 static struct ast_channel_tech *cur_tech;
 
+static int phone_indicate(struct ast_channel *chan, int condition)
+{
+       struct phone_pvt *p = chan->tech_pvt;
+       int res=-1;
+       ast_log(LOG_DEBUG, "Requested indication %d on channel %s\n", condition, chan->name);
+       switch(condition) {
+               case AST_CONTROL_FLASH:
+                       ioctl(p->fd, IXJCTL_PSTN_SET_STATE, PSTN_ON_HOOK);
+                       usleep(320000);
+                       ioctl(p->fd, IXJCTL_PSTN_SET_STATE, PSTN_OFF_HOOK);
+                       p->lastformat = -1;
+                       res = 0;
+                       break;
+               default:
+                       ast_log(LOG_WARNING, "Condition %d is not supported on channel %s\n", condition, chan->name);
+       }
+       return res;
+}
+
 static int phone_fixup(struct ast_channel *old, struct ast_channel *new)
 {
        struct phone_pvt *pvt = old->tech_pvt;