Differences

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

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
sdk:scripts:voice-dispatcher-audio [2022/08/23 13:33]
juraschek
sdk:scripts:voice-dispatcher-audio [2022/09/05 12:27] (current)
schmitt
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 = 1;           // polling status change every x seconds  +INTERVAL = 3;           /* 3 seconds ​*/ 
-NUMBER = "​+123456789";​ /number to call when DI1 = on +NUMBER = "​+123456789"; ​ /number to call when DI1 = on */
  
 template dispatcher { template dispatcher {
Line 36: Line 26:
                 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 56: Line 46:
  
         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 68: Line 58:
     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(d.audio);​
         if (!is_struct(au)) {         if (!is_struct(au)) {
Line 77: Line 67:
         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 84: Line 74:
  
             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 93: Line 83:
                     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 101: Line 90:
             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 110: Line 99:
                 }                 }
             }             }
-            nb_dio_set("​out2",​ 0); // no active call  
         }         }
  
Line 124: Line 112:
         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(d.audio);​
         if (!is_struct(au)) {         if (!is_struct(au)) {
Line 135: Line 123:
         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 141: Line 129:
                           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 160: Line 146:
                     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 170: Line 157:
                                 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 // + 
-                                    return; ​// call established ​+                                    if (1) { 
 +                                        ​/* 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 180: Line 172:
                         }                         }
                     }                     }
-                    /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 193: Line 184:
     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 209: Line 200:
  
 d = new dispatcher();​ d = new dispatcher();​
-nb_dio_set("​out1",​ 0); // clear signaling ​ 
 dump(d); dump(d);
 d.run(); d.run();
  
 exit(0); exit(0);
- 
 </​code>​ </​code>​