In questi giorni sto realizzando un centralino PSTN utilizzando ubuntu 8.04.03 LTS e Freeswitch. Qualcuno magari si domanderà "perché utilizzare un software per centralini voip quando si può usare un centralino bello e pronto?" la risposta, molto semplice, è "i costi sono ben differenti!": con il costo di un centralino base con 8 interni, un esterno, funzionalità day/night con voce pre-registrata e segreteria telefonica ci viene fuori un server con su freeswitch con un numero di interni illimitati utilizzando telefoni voip, numero di linee esterne variabile con facilità senza costi assurdi, IVR, cancellazione dell'echo, casella vocale per utente, funzionalità day/night configurabile con casella vocale e sintetizzatore per cambiare il testo con facilità, possibilità di utilizzare dei gateway gsm per le chiamate ai telefonini e via dicendo.
Devo dire che stava procedendo tutto molto bene fino a qualche giorno fa, quando mi sono imbattuto in uno strano problema: dopo la prima chiamata effettuata tramite la linea analogica, freeswitch non riconosceva più il segnale di linea libera e andava in timeout non eseguendo la chiamata! La cosa che mi faceva impazzire è che le chiamate in ingresso funzionavano perfettamente!!!
Oggi pomeriggio, dopo aver provato non so quante combinazioni di freeswitch/zaptel/schede analogiche diverse e aver fatto tutti i controlli possibili ed immaginabili sulla linea, mi sono messo a spulciare il codice sorgente del modulo mod_openzap e, finalmente, dopo aver capito quale parte di codice effettuava il riconoscimento dei toni ho scoperto che un valore, che indicava il numero di toni che servivano a identificare lo stato della linea, dopo ogni chiamata veniva incrementato!
Ho provato a sistemare il bug da solo ma sinceramente non avevo idea di dove mettere le mani e tutti i tentativi risultavano in un bel segmentation fault, così dopo uno scambio di battute sul canale IRC di freeswitch, con qualche riga di codice, hanno sistemato il problema!
Nello specifico, il modulo mod_openzap alla chiusura della chiamata non resettava dei valori che venivano reinizializzati ad ogni chiamata con il risultato che questi venivano incrementati ad ogni chiamata impedendo cosi il riconoscimento del tono.
uint32_t i; . . . for (i = 1; i < ZAP_TONEMAP_INVALID; i++) { zchan->span->tone_finder[i].tone_count = 0; }
Dopo una lunga discussione sul canale irc di openzap, Anthony Minessale ha scritto questa piccola patch ed il problema è magicamente sparito :) Sinceramente avevo provato a risolverlo da solo, ma non sapendo dove mettere le mani di preciso sono riuscito ad ottenere solo una bel pò di segmation fault!
Posso dire di aver dato il mio piccolo contributo a freeswitch :)

Invia nuovo commento