viernes, 30 de noviembre de 2012

música de fondo en las llamadas con Asterisk

... la BSO de tu vida ...

Buenas tardes, llevo un par de días probando configuraciones en Asterisk (el que tengo en el RaspberryPi) para poder música (o lo que sea) de fondo de una llamada que pase por la centralita. La idea es pulsar un código por DTMF durante una llamada, para que se escuche una música navideña, de miedo, pena o lo que se quiera y tener así tu propia BSO. Veamos como se hace ...

Como ya sabéis, tengo un Asterisk y un SPA3102 para comunicarme con el mundo antiguo. Para el resto uso GTalk o lo que se tercie. IMPORTANTE: las instrucciones que voy a explicar, son muy específicas de mi instalación, cuando lo vayas a poner en tu casa/oficina, ten mucho cuidado con el nombre de los canales.
Primero es tener preparada la música, yo tengo estos dos mp3:
root@raspberrypi:~# ls /home/pi/mp3/
monkey.mp3  requiem.mp3  navidad.mp3
lo que viene a ser el Monkey Island y la de Requiem que siempre suelen usar los de anonymous en sus vídeos. Ahora en el features.conf de Asterisk:
[applicationmap]
bso1 => *3,self/both,System,/bin/bash /usr/local/bin/asterisk_bso.sh start monkey
bso2 => *4,self/both,System,/bin/bash /usr/local/bin/asterisk_bso.sh start requiem
bso3 => *5,self/both,System,/bin/bash /usr/local/bin/asterisk_bso.sh start navidad
bsoend => *0,self/both,System,/bin/bash /usr/local/bin/asterisk_bso.sh stop testfeature
defiinimos así que cuando se pulse *3 sonará el Monkey Island, con *4 Requiem y con *0 paramos la reproducción. Ahora el script en cuestión /usr/local/bin/asterisk_bso.sh :
#!/bin/bash
# programado por Juanmol para http://rsppi.blogspot.com
case $1 in
        start )
                fullcanal=$(asterisk -rx "core show channels" | grep Up | grep -E 0[0-9]{8} | awk '{ print $1 }')
                peer=$(echo $fullcanal | cut -f1 -d\- | cut -f2 -d\/)
                cat << EOF > /tmp/$2.call
Channel: Local/$peer@bso
Application: Playback
Data: /home/pi/mp3/$2
EOF
                mv /tmp/$2.call /var/spool/asterisk/outgoing/
                cat << EOF > /tmp/$2gate.call
Channel: Local/gateway@bso
Application: Playback
Data: /home/pi/mp3/$2
EOF
                mv /tmp/$2gate.call /var/spool/asterisk/outgoing/

        ;;
        stop )
                for n in $(asterisk -rx "core show channels concise" | grep ^Local | cut -f1 -d\!);
                do
                        asterisk -rx "hangup request $n";
                done
        ;;
esac
ese hermoso script crea archivos .call para generar automáticamente las llamadas. La idea es usar la función ChanSpy en modo susurro para reproducirlo. En el extensions.conf definimos:
[salientes]
exten => _0X.,1,NoOp(llamada al ${EXTEN:1} con BSO)
same => n,Set(DYNAMIC_FEATURES=bso1#bso2#bso3#bsoend)
same => n,Dial(${gtw}/${EXTEN:1},,tT)
${GTW} en mi caso es el gateway SPA3102. Le pongo delante un 0, para dejar otro contexto igual, pero sin el DYNAMIC_FEATURES, por si queremos hacer una llamada seria, sin temor a ponerle BSO de fondo. Y ahora la parte interesante, en este contexto entran las llamadas automáticas y activan el modo espia + susurro:
[bso]
exten => _.,1,Answer()
same => n,ChanSpy(SIP/${EXTEN},qwEv(-4))
same => n,Hangup()
breve pero perfecto. Y poco más, ahora le hacemos al Asterisk un module reload, llamamos a alguien (con un 0 delante) y pulsamos alguna de las features :) ¡Venga! usa la imaginación, ponle música a tus felicitaciones navideñas, ten preparado un mp3 con los llantos de un bebé para cuando no consigues terminar una llamada, un león rugiendo, música de feria ...

No hay comentarios:

Publicar un comentario