Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Next revision
Previous revision
Last revisionBoth sides next revision
sdk:scripts:voice-dispatcher-audio [2015/05/05 15:04] – external edit 127.0.0.1sdk:scripts:voice-dispatcher-audio [2022/08/30 15:29] cakir
Line 2: Line 2:
 <code c voice-dispatcher-audio.are> <code c voice-dispatcher-audio.are>
 /* DESC: This script implements an audio voice dispatcher /* DESC: This script implements an audio voice dispatcher
 + * The first audio Interface (line-in/out) is used for the GSM-Call audio.
 + * - Dialing os controlled via digital in 1 (in1)
 +   If it is set high (1), the predefined nummer is called. 
 +   Must be set to high (1) to acknowledge incomming calls.
 +   Any call will be terminated when it goes low (0).
 + * - Incomming calls are signaled at digital out 1 (out1). 
 +   It's set to high (1) when call is incomming and statys high during call.
 +   It will go to low (0) when the call is ended.
 + *
  * Copyright (C) 2012 NetModule AG, Switzerland  * Copyright (C) 2012 NetModule AG, Switzerland
 + 
  */  */
  
-INTERVAL = 3;           /* 3 seconds *+INTERVAL = 1;           // polling status change every x seconds  
-NUMBER = "+123456789";  /number to call when DI1 = on */+NUMBER = "+123456789"; /number to call when DI1 = on 
  
 template dispatcher { template dispatcher {
Line 26: Line 36:
                 nb_syslog("%d: endpoint %d is in state %s (%s)", i, id, state, desc);                 nb_syslog("%d: endpoint %d is in state %s (%s)", i, id, state, desc);
  
-                /record first audio endpoint */+                /record first audio endpoint 
                 if (is_void(aud) && left(desc, 6) == "aud://") {                 if (is_void(aud) && left(desc, 6) == "aud://") {
                     this.audio = ep;                     this.audio = ep;
Line 46: Line 56:
  
         if (in1 == this.in1) {         if (in1 == this.in1) {
-            /no state change */+            /no state change 
             return -1;              return -1; 
         } else {         } else {
-            /update state */+            /update state 
             nb_syslog("updating dio state");             nb_syslog("updating dio state");
             this.in1 = in1;             this.in1 = in1;
Line 58: Line 68:
     int handle_dio_event (int ev)     int handle_dio_event (int ev)
     {     {
-        /update endpoint first */ +        /update endpoint first  
-        au = nb_voice_endpoint_get(d.audio);+        au = nb_voice_endpoint_get(this.audio.id);
         if (!is_struct(au)) {         if (!is_struct(au)) {
             nb_syslog("updating audio endpoint failed");             nb_syslog("updating audio endpoint failed");
Line 67: Line 77:
         austate = struct_get(au, "state");         austate = struct_get(au, "state");
  
-        /get list of currently active calls */+        /get list of currently active calls
         calls = nb_voice_call_list();         calls = nb_voice_call_list();
  
Line 74: Line 84:
  
             if (austate == "available") {             if (austate == "available") {
-                /initiate new call */+                /initiate new call 
                 call = mkstruct("calling", audesc,                 call = mkstruct("calling", audesc,
                                 "called", NUMBER);                                 "called", NUMBER);
Line 83: Line 93:
                     nb_syslog("unable to initate call to %s", NUMBER);                     nb_syslog("unable to initate call to %s", NUMBER);
                 }                 }
 +              nb_dio_set("out2", 1); // call is active 
             } else {             } else {
                 nb_syslog("not calling %s as endpoint %s is not available", NUMBER, audesc);                 nb_syslog("not calling %s as endpoint %s is not available", NUMBER, audesc);
Line 90: Line 101:
             nb_syslog("DI1 has been opened");             nb_syslog("DI1 has been opened");
  
-            /terminate any active calls */+            /terminate any active calls 
             for (i = 0; i < length(calls); i++) {             for (i = 0; i < length(calls); i++) {
                 call = calls[i];                 call = calls[i];
Line 99: Line 110:
                 }                 }
             }             }
 +            nb_dio_set("out2", 0); // no active call 
         }         }
  
Line 112: Line 124:
         nb_syslog("received voice event '%s' on call %d\n", type, id);         nb_syslog("received voice event '%s' on call %d\n", type, id);
  
-        /update endpoint */ +        /update endpoint  
-        au = nb_voice_endpoint_get(d.audio);+        au = nb_voice_endpoint_get(this.audio.id);
         if (!is_struct(au)) {         if (!is_struct(au)) {
             nb_syslog("updating audio endpoint failed");             nb_syslog("updating audio endpoint failed");
Line 123: Line 135:
         switch (type) {         switch (type) {
             case "outgoing":             case "outgoing":
-                /don't touch any locally initiated calls */+                /don't touch any locally initiated calls 
                 break;                 break;
             case "incoming":             case "incoming":
Line 129: Line 141:
                           id, struct_get(call, "calling"), struct_get(call, "called"));                           id, struct_get(call, "calling"), struct_get(call, "called"));
  
-                /route any incoming calls to audio device */+                /route any incoming calls to audio device 
                 if (nb_voice_call_route(call, audesc) == 0) {                 if (nb_voice_call_route(call, audesc) == 0) {
                     nb_syslog("routing call %d to %s", id, audesc);                     nb_syslog("routing call %d to %s", id, audesc);
 +                    nb_dio_set("out2", 1); // ring, incomming call 
                 } else {                 } else {
                     nb_syslog("unable to route call %d to %s", id, audesc);                     nb_syslog("unable to route call %d to %s", id, audesc);
                     nb_voice_call_hangup(call);                     nb_voice_call_hangup(call);
 +                    // no signaling 
                 }                 }
                 break;                 break;
             case "dispatched":             case "dispatched":
-                /accept calls if DI1 closes */+                /accept calls if DI1 closes 
  
                 nb_syslog("call %s: %s to %s got dispatched",                 nb_syslog("call %s: %s to %s got dispatched",
Line 146: Line 160:
                     if (austate == "available") {                     if (austate == "available") {
                         nb_syslog("hanging up call %d as audio is busy", id);                         nb_syslog("hanging up call %d as audio is busy", id);
-                        nb_voice_call_hangup(call); 
                     } else {                     } else {
-                        /wait until IN1 has been closed */+                        /wait until IN1 has been closed 
                         nb_syslog("waiting 10s until IN1 is closed");                         nb_syslog("waiting 10s until IN1 is closed");
                         for (i = 0; i < 10; i++) {                         for (i = 0; i < 10; i++) {
Line 157: Line 170:
                                 if (nb_voice_call_accept(call) == 0) {                                 if (nb_voice_call_accept(call) == 0) {
                                     nb_syslog("accepted call %d", id);                                     nb_syslog("accepted call %d", id);
- +                                    // nb_voice_call_volume(call, 7); increase volume level to max // 
-                                    if (1) { +                                    return; // call established 
-                                        /* increase volume level */ +
-                                        nb_voice_call_volume(call, 7); +
-                                    } +
- +
-                                    return;+
                                 } else {                                 } else {
                                     nb_syslog("unable to accept call %d", id);                                     nb_syslog("unable to accept call %d", id);
Line 172: Line 180:
                         }                         }
                     }                     }
-                    /otherwise hangup */+                    /otherwise hangup 
                     nb_syslog("hanging up call %d", id);                     nb_syslog("hanging up call %d", id);
                     nb_voice_call_hangup(call);                     nb_voice_call_hangup(call);
 +                    nb_dio_set("out2", 0); // error, no active call 
                 }                 }
                 break;                 break;
Line 184: Line 193:
     void run ()     void run ()
     {     {
-        /wait for calls */+        /wait for calls 
         while (1) {         while (1) {
             event = nb_voice_event(INTERVAL);             event = nb_voice_event(INTERVAL);
Line 200: Line 209:
  
 d = new dispatcher(); d = new dispatcher();
 +nb_dio_set("out1", 0); // clear signaling 
 dump(d); dump(d);
 d.run(); d.run();