Translate

lunes, 17 de septiembre de 2012

Portero IP con Asterisk y Tarjeta de Sonido USB

Existen Porteros IP que son usados con conmutadores IPPBX, estos porteros estan basados en el protocolo SIP.

Ya que la Raspberry es capaz de Correr Asterisk y a su vez cuenta con un puerto de Entradas y Salidas es capaz de que emulemos un Portero IP a un precio muy muy bajo.

Suponiendo que ya tenemos corriendo nuestro Asterisk en la Raspberry Pi y tenemos una tarjeta de sonido USB conectada, solo necesitamos lo siguiente:

1) Compila Asterisk con soporte para ALSA y OSS necesitas algunas dependencias:
yum install -y portaudio-devel alsa-*


2) Ejecuta de nuevo el script configure y make menuselect. Asegurate de tener habilitadas las opciones de chan_alsa y chan_oss:




3) Compila Asterisk:

[root@FCRaspi certified-asterisk-1.8.11-cert6]# make && make install
4) En mi caso usaré el canal ALSA de modo que necesito saber cual es el harwdare que identifica mi tarjeta de sonido USB:


[root@FCRaspi ~]# aplay -l

**** List of PLAYBACK Hardware Devices ****
card 0: ALSA [bcm2835 ALSA], device 0: bcm2835 ALSA [bcm2835 ALSA]
  Subdevices: 8/8
  Subdevice #0: subdevice #0
  Subdevice #1: subdevice #1
  Subdevice #2: subdevice #2
  Subdevice #3: subdevice #3
  Subdevice #4: subdevice #4
  Subdevice #5: subdevice #5
  Subdevice #6: subdevice #6
  Subdevice #7: subdevice #7
card 1: Device [Generic USB Audio Device], device 0: USB Audio [USB Audio]
  Subdevices: 0/1
  Subdevice #0: subdevice #0

Ahora ya sabemos que el hardware que vamos a utilizar es plughw:1,0. Ya que la tarjeta de sonido USB esta en card: 1, device 0

5) Editamos el archivo /etc/astrerisk/alsa.conf:

;
; Open Sound System Console Driver Configuration File
;
[general]
;
; Automatically answer incoming calls on the console?  Choose yes if
; for example you want to use this as an intercom.
;
autoanswer=yes
;
; Default context (is overridden with @context syntax)
;
context=console
;
; Default extension to call
;
extension=s
;
; Default language
;
language=en
;
; Default Music on Hold class to use when this channel is placed on hold in
; the case that the music class is not set on the channel with
; Set(CHANNEL(musicclass)=whatever) in the dialplan and the peer channel
; putting this one on hold did not suggest a class to use.
;
mohinterpret=default
;
; Silence suppression can be enabled when sound is over a certain threshold.
; The value for the threshold should probably be between 500 and 2000 or so,
; but your mileage may vary.  Use the echo test to evaluate the best setting.
;silencesuppression = yes
;silencethreshold = 1000
;
; To set which ALSA device to use, change this parameter
input_device=plughw:1,0
output_device=plughw:1,0

;
; Default mute state (can also be toggled via CLI)
mute=false

;
; If enabled, no audio capture device will be opened.  This is useful on
; systems where there will be no return audio path, such as overhead pagers.
noaudiocapture=dalse

;------------------------------ JITTER BUFFER CONFIGURATION --------------------------
; jbenable = yes              ; Enables the use of a jitterbuffer on the receiving side of an
                              ; ALSA channel. Defaults to "no". An enabled jitterbuffer will
                              ; be used only if the sending side can create and the receiving
                              ; side can not accept jitter. The ALSA channel can't accept jitter,
                              ; thus an enabled jitterbuffer on the receive ALSA side will always
                              ; be used if the sending side can create jitter.

; jbmaxsize = 200             ; Max length of the jitterbuffer in milliseconds.

; jbresyncthreshold = 1000    ; Jump in the frame timestamps over which the jitterbuffer is
                              ; resynchronized. Useful to improve the quality of the voice, with
                              ; big jumps in/broken timestamps, usually sent from exotic devices
                              ; and programs. Defaults to 1000.

; jbimpl = fixed              ; Jitterbuffer implementation, used on the receiving side of a SIP
                              ; channel. Two implementations are currently available - "fixed"
                              ; (with size always equals to jbmax-size) and "adaptive" (with
                              ; variable size, actually the new jb of IAX2). Defaults to fixed.

; jbtargetextra = 40          ; This option only affects the jb when 'jbimpl = adaptive' is set.
                              ; The option represents the number of milliseconds by which the new
                              ; jitter buffer will pad its size. the default is 40, so without
                              ; modification, the new jitter buffer will set its size to the jitter
                              ; value plus 40 milliseconds. increasing this value may help if your
                              ; network normally has low jitter, but occasionally has spikes.

; jblog = no                  ; Enables jitterbuffer frame logging. Defaults to "no".
;-----------------------------------------------------------------------------------



6) Al archivo /etc/asterisk/modules.conf añadimos la linea noload=>chan_oss.so.

7) Si  vamos a llamar a un servidor remoto configuramos el archivo extensions.conf de la siguiente manera:


[console]
exten => s,1,SET(CALLERID(name)=DOOR)
same => n,Set(__DYNAMIC_FEATURES=toggle)
same => n,Dial(SIP/5001@IPREMOTE)
same => n,hangup()


El servidor remoto tenemos que configurarlo de modo que acepte llamadas no autentificadas con la linea de configuración allowguest=yes en el archivo /etc/asterisk/sip.conf

Y configurar el contexto donde se reciben las llamadas anonimas con:


[guest]
exten => 5001,1,Dial(SIP/5001)
same => n, Hangup()


Si es en el mismo servidor local(en la misma raspberry pi) solo editamos el archivo extension.conf local:


[console]
exten => s,1,SET(CALLERID(name)=DOOR)
same => n,Set(__DYNAMIC_FEATURES=toggle)
same => n,Dial(SIP/5001)
same => n,hangup()


8) Configurar los GPIO de la Raspberry para leer el estado de los pines y para enviar la order de activar la chapa. ejecutar estas lineas y añadirlas al archivo  rc.local para que esten disponibles siempre aun después de reinciar.

[root@FCRaspi ~]# echo "4" > /sys/class/gpio/export
[root@FCRaspi ~]# echo "out" > /sys/class/gpio/gpio4/direction
[root@FCRaspi ~]# echo "17" > /sys/class/gpio/export
[root@FCRaspi ~]# echo "in" > /sys/class/gpio/gpio17/direction

La pimer línea activa el PIN 4 para su uso.
La segunda línea establece como salida el pin 4. El cual usaremos para activar la chapa.
La tercera línea activa el PIN 17 para su suo.
La cuarta línea establece como entrada el pin 17. El cual usaremos como el boton de llamar.

Para mas información acerca de los PINES ir a http://elinux.org/RPi_Low-level_peripherals
NOTE QUE EL PIN 4 No corresponde al PIN 4 del conector de la RASPBERRY, el PIN 4 del CHIP es el PIN P1_07 del CONECTOR. 


9) Crear el script que verificará el estado del boton cuando este presionado el chip recibirá un 0 lógico y enviará la llamada. Lo llamaré ipdoor.sh:


#!/bin/bash
while true;
do

  cmd=$(cat /sys/class/gpio/gpio17/value)

   if [ $cmd = '0' ]; then
   #echo "Marcando"
   asterisk -rx 'console dial'
  fi
sleep 1
done


10) Crear el script que activará la chapa durante 3 segundos y la desactivará después. Lo llamaré toggle.sh:

#!/bin/bash

echo "1" > /sys/class/gpio/gpio4/value
sleep 3
echo "0" > /sys/class/gpio/gpio4/value


11) Añadir al archivo features.conf  debajo de [applicationmap] el código que activara la chapa:

toggle => 88,peer,System,sh /root/toggle.sh

12) Ejecutamos en el background el script ipdoor.sh con:

nohup sh ipdoor.sh &


13) El diagrama de Conexión es el siguiente, para pruebas  usaremos un boton normalmente abierto y un led como la chapa. Puedes usar la etapa de Potencia que te convenga para conectarla a tu chapa:



14) Recargamos Asterisk y probamos. En este Video la Raspberry Pi envía la llamada a un servidor remoto y al enviar desde el telefono remoto el codigo 88 se enciende el led lo que activaría la chapa.










57 comentarios:

  1. wahoo you realise what i would like to do. Do you project to integrate a webcam ?

    ResponderEliminar
  2. This looks amazing stuff. I only want a doorbell not the voice, I have seen a diagram of the wiring circuit here http://www.raspberrypi.org/phpBB3/viewtopic.php?t=15348&p=168350 but my question is I have installed IncrediblePBX which uses FreePBX, how do I set up the scripts in this and what scripts will I need for just the doorbell push?

    I understand if I set up any custom .conf file the FreePBX web interface will wipe it, so do you know how I would set the extension up on FreePBX? (Have you tried IncrediblePBX? I am really pleased with it, I would love to integrate your idea on this).

    Thanks!

    ResponderEliminar
    Respuestas
    1. Hi Stuart,

      Yes you can use it with FreePBX, the script that monitor the status of the button its the same just instead calling via console you need to call your devices, i.e. To call the sip peer 1000 and deliver a "beep" sound the script looks like:

      #!/bin/bash
      while true;
      do

      cmd=$(cat /sys/class/gpio/gpio17/value)

      if [ $cmd = '0' ]; then
      #echo "Dialing to SIP/1000"
      asterisk -rx 'originate SIP/1000 application Playback beep'
      fi
      sleep 1
      done

      The script will work without editing the extensions_custom.conf, since the command "originate" is making a direct dial to one peer, but if you want to originate the call using a LOCAL channel in order to make fancy stuff(like log the call, execute an agi, deliver other kind of audio, etc. etc.) You need to edit the file extensions_custom.conf that file is not wiped by freepbx and its included in the dialplan when you execute a "dialplan reload", so its safe to use *_custom.conf files to add stuff in freepbx.

      You can save the script in the your preferred path, just need to be running always in the background.

      You can modify the originate string for your needs. Remember to setup the GPIO fisrt:

      # echo "17" > /sys/class/gpio/export
      # echo "in" > /sys/class/gpio/gpio17/direction

      Best Regards.

      Eliminar
  3. Hello Max, great job!

    I want to implement also my intercom but adding video capabilities to allow the person inside the house see who is outside. Do you envision big changes in your code to allow that or it is a matter of configuring the video hardware?

    Another question is, why is asterisk needed in the outdoor side? It is not enough using any softphone software capable of doing video calls?

    Thank you very much.

    Leo

    ResponderEliminar
    Respuestas
    1. Hi Leo,

      Adding the video using this guide will be a hard task, because I'm using the native 'console dial' command from asterisk. Since you can edit the source code of console dial its possible to add video capabilities.

      About your last question, I'm using asterisk because it act as sip client in order to register with others SIP legacy PBX, and the configuration is edited via web page since no monitor was connected to the Pi. This project was a generic clone of the 2N's IP Doorbell or Teltonika's Ip door bell.

      And finally, yes you can use a softphone in order to use video capabilities if you already using a desktop in your Pi otherwise you can use a softphone with console capabilities like linphone and send commands using the linphonecsh daemon via web or shell.

      Best Regards.

      Eliminar
  4. Max thank you for your answer.
    The linphone point would be a key to success with the video.
    I did not knew about it and the linphonecsh give lot of possibilities and flexibility.

    ResponderEliminar
  5. Max,

    Nice article, 2N's have asterisk built in?
    Also if I was to go with your linphone suggestion (no video) just because it probably more light weight, can you control a door strike with DTMF natively in Linphone?

    ResponderEliminar
    Respuestas
    1. Hi,

      --"2N's have asterisk built in?"
      No 2N use a FPGA or ARM(not remember right now) with a full SIP stack in it.

      --"Also if I was to go with your linphone suggestion (no video) just because it probably more light weight, can you control a door strike with DTMF natively in Linphone?"

      From the Raspberry/Linphone You (maybe)need to edit the source code to trigger events on DTMF.

      From the Asterisk side(The registrar server for the Raspberry) you can create a custom Feature to send via Network(TCP or UDP) a command to Trigger the Raspberry pi Output, so in My opinion this is easier than edit the Linphone's source code.

      Best Regards.

      Eliminar
    2. Max,

      Thank you for the reply-

      I will see what I find, I found this guy wrote script for python using Linphone - I think its for one direction only and doesnt include DTMF.

      https://github.com/ccook5/IP-Entry-Phone

      I also had to reboot my PI after running the script as I was not able to run anything afterwards.

      Thanks

      Eliminar
  6. Asterisk should support video calls from the cli:

    http://russellbryantnet.wordpress.com/2007/12/18/asterisk-as-a-video-soft-phone/

    ResponderEliminar
    Respuestas
    1. Thanks for the Input, that should help a lot of people.

      Eliminar
  7. Hello Max.

    very good example, thank you.

    Can you show a example to use raspberry and usb sound card for capture audio and record like a call.
    I want to use a raspberry for Radio comunnications recording.

    ResponderEliminar
    Respuestas
    1. Hi Ivan,

      Using asterisk too? If so, its quite simple you need only to call an extension and start recording, then if you want to send the recording you can use the extension H to manipulate that recording or you can run a command or script when the recording end.

      Eliminar
  8. Hola, nosotros tenemos un portero de 5 hilos (4+n). Sabes si seria posible conectar el timbre, sonido y abre puertas a la raspberry pi para que cuando timbren se conecte sobre SIP?

    ResponderEliminar
    Respuestas
    1. Hola,

      Todo depende del tipo de portero que uses, si es analógico vas a necesitar un ATA para conectarlo al server SIP. Si es SIP puede ser directo, lo mejor es que consigas la hoja de datos de tu portero y en base a esa información consigas el ATA o lo conectes directo.

      Eliminar
  9. ola

    poderia me informar que linux tu uses no seu raspberry ? tentei seguir seus instrucoes, mas ja no yum meu raspbian distribuition reclamou.

    grato muito micha

    ResponderEliminar
    Respuestas
    1. Yo uso fedora-remix, para raspbian usa apt-get install o aptitude.

      Eliminar
  10. Hola Max, seguí tu tutorial, y ya tengo los pulsos y todo, pero como solucionas el abrir una chapa de 12v con el voltage de salida de la Raspberry?

    ResponderEliminar
    Respuestas
    1. Necesitas establecer una etapa de potencia para hacer eso. La Raspberry no tiene la capacidad de hacerlo directamente. Yo te recomendaria usar optoacopladores entre la RPi y tu etapa de potencia.

      Checa esta página te puede ayudar a hacerlo: http://elinux.org/RPi_Tutorial_EGHS:12V_relay_driver

      Eliminar
  11. Hola, está muy bueno el tuto. Te hago una consulta, ¿sería posible hacer algo más simple? Digamos
    1) Un trafo de 12V conectado a una placa con un PIC programado para que
    2) Cuando envío un pulso analógico (tendría que tener un módulo FXS conectado a la placa) este pic detecte el pulso y deje pasar un flujo corriente por unos 3 segundos

    Yo hice algo así para manejar varios motores pero los pulsos los mandaba vía puerto serie de una PC...No sé de electrónica pero me parece viable. ¿Cuál es tu opinión? scap2000@yahoo.com

    ResponderEliminar
    Respuestas
    1. Lo "complicado" sería interconectar el FXS con el PIC. Busca en google openusbfxs ya hay un proyecto que te puede ayudar.

      También te recomiendo darle un vistazo a mi blog: m2ethboard.blogspot.com Ahí encontrarás como conectar un PIC con ethernet y también enviarle señales vía protocolo IAX2.

      Eliminar
    2. Pssss, sos un maestro. Gracias!

      Eliminar
  12. Max,
    Sabias que asterisk soporta usar un dispositivo v4l en chan_console desde Asterisk 1.6? Tambien vi que ahora hay un driver v4l para la camara de la Raspberry Pi, asi que voy a hacer un par de pruebas y te posteo en el blog.

    ResponderEliminar
    Respuestas
    1. Hola, no no lo sabía gracias por compartir. Cuando tengas las pruebas por favor peganos tu enlace aquí seguro muchos estarán encantados con eso.

      Eliminar
  13. Excelente publicacion, todo se hace directo con raspberry, hay manera de hacerlo directo con una pc montado con elastix?

    ResponderEliminar
    Respuestas
    1. Es exactamente lo mismo, el problema que vas a tener con la PC es que no tienes GPIO.

      Eliminar
    2. Gracias por tu respuesta Max, estoy pensando en la posibilidad de instalar Micro Elastix (uelastix.com) y desde ahi aplicar lo de tu tutorial, cres que se complicaria?

      Eliminar
    3. No, es lo mismo solo que usarás los archivos *_custom.conf.

      Eliminar
  14. IP PBX asterisk are used in the Raspberry Pi and it works well for this kind of systems.

    ResponderEliminar
  15. hola,
    estoy haciendo un trabajo muy semejante con este tutorial, y me gustaria saber como se puede poner video. Tengo una camera de ps3 y una raspicam. Linphone no envia imagen de ninguna manera. Me pueden ayudar?

    saludo a todos

    ResponderEliminar
    Respuestas
    1. Comentarios ma arriba hay un link que explican como habilitar el video, por otro lado también podrias probar la solución de https://github.com/op2-project/op2-project.github.io

      Eliminar
    2. pero no hay ningun tutorial que pueda seguir?
      con la configuracion que tengo, quando conecto la raspicam se apaga unos segundos despues de ligar el linphone. Con lá camera de la ps3 la luz rojo se queda encendida e en el otro ordenador recebe imegen negra

      Eliminar
    3. No, no lo hay para linphone, el del link es para asterisk y el otro es para evitar el uso de asterisk haciedno uso de un stack sip. Si lo que quieres es algo step-by-step necesitarás hacerlo via freelance.com o algo parecido.

      Eliminar
    4. Mi configuracion del asterisk me permite hacer llamadas de video entre dos ordenadores con windows. Hasta con linphone en ubuntu. no entiendo porque no me deja con la raspberry

      Eliminar
    5. Eso no tiene nada que ver, en el caso que mencionas asterisk no hace nigun transcoding de video, mientras loc clientes se vean y tengan/soporten los mismos codecs se vera el video, ahora lo que tu quieres usando la raspberry es que el Asterisk sea el cliente y haga el encoding y decoding del mismo.
      Mas info http://www.voip-info.org/wiki/view/Asterisk+video
      https://wiki.asterisk.org/wiki/display/AST/Video+Console

      Yo te recomiendo que veas mejor el proyecto Open Pi Phone que te mencione arriba creo que es una mejor alternativa a usar asterisk.

      Eliminar
  16. Hola, Max:

    Necesito entablar una comunicación entre el servidor Asterisk (FreePBX) y un cliente SIP (Mi teléfono Android).

    ¿Es posible lo que necesito con este tutorial? He probado varios pero al momento de hacer el "console dial 100@from-internal" no hay audio, solo me llega la llamada.

    Espero tu respuesta.

    Saludos,

    ResponderEliminar
    Respuestas
    1. No esto es para otra cosa, lo que necesitas es registrar tu cliente de android en tu PBX con los datos de la cuenta y listo. Todo lo demas lo haces via FreePBX.

      Eliminar
    2. Necesito generar una llamada entre el mismo servidor y un cliente SIP, estoy tratando de hacer un intercomunicador. (Sin el tema de abrir puertas).

      Para llamadas SIP 2 SIP no he tenido problemas, pero no sé como hacer para que el servidor comience la llamada hacia un cliente SIP. ¿Alguna idea?

      Eliminar
    3. Puedes usar Originate o como lo describe el tutorial de esta entrada. si tienes porblemas de audio checa tus configuraciones de NAT.

      Eliminar
    4. Hola, Max:

      He logrado entablar la comunicación con 'console dial 100@from-internal' estaba equivocándome en la configuración del archivo "alsa.conf"

      Aún tengo un problema, y es que el servidor (RPI) no envía la captura de vídeo en los clientes. ¿Alguna idea sobre dónde hay que configurar?

      Gracias y saludos,

      Eliminar
    5. Ni idea pero con el SIP debug y el del rtp puedes saber que pasa.

      Eliminar
  17. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  18. hola, ya arme todo el proyecto de videoportero pero no he podido interconectar mi servidor elastix con el raspberry, supongo que podria ser algo relacionado con la configuracion sip o la de ip, ya segui muchos manuales y configuraciones sin exito, en la raspberry pi tengo varias memorias con pidora, rapbian, raspbx, todo aparentemente bien configurado, el servidor elastix es version 2.4 con un pentium dual core, con una tarjeta fxs y fxo, operando correctamente con las lineas sip de la oficina, mi temor es dañar la configuracion a tratar de interconectar el portero ip con el servidor elastix. agradeceria mucho su apoyo u orientacion. Gracias!!!

    ResponderEliminar
    Respuestas
    1. Lo primero es que muestres tus configuraciones y una breve descripción de la topología de red. Así a ciegas es difícil atinarle al problema. Comienza con poner lo que has intentado hacer.

      Eliminar
  19. Hola.

    Muy buen aporte, llevaba tiempo queriendo hacer algo similar pero sin el audio. He montado el proyecto pero tengo un problemilla, no consigo que la tarjeta de sonido usb (he probado dos modelos) capture audio cuando se establece la llamada con la extensión (teléfono ip). He realizado pruebas con arecord y reproducir el archivo grabado con aplay y funciona correctamente.

    En principio parece problema de asterisk.

    La configuración de la tarjeta de sonido en alsa.conf es:

    input_device=plughw:0,0
    output_device=plughw:0,0

    y el comando aplay -l

    **** List of PLAYBACK Hardware Devices ****
    card 0: Set [C-Media USB Headphone Set], device 0: USB Audio [USB Audio]
    Subdevices: 1/1
    Subdevice #0: subdevice #0
    card 1: ALSA [bcm2835 ALSA], device 0: bcm2835 ALSA [bcm2835 ALSA]
    Subdevices: 8/8
    Subdevice #0: subdevice #0
    Subdevice #1: subdevice #1
    Subdevice #2: subdevice #2
    Subdevice #3: subdevice #3
    Subdevice #4: subdevice #4
    Subdevice #5: subdevice #5
    Subdevice #6: subdevice #6
    Subdevice #7: subdevice #7
    card 1: ALSA [bcm2835 ALSA], device 1: bcm2835 ALSA [bcm2835 IEC958/HDMI]
    Subdevices: 1/1
    Subdevice #0: subdevice #0

    ¿Tienes una idea de que puedo estar haciendo mal?

    Gracias anticipadas.

    ResponderEliminar
  20. Hola, gracias por la ayuda y datos.
    Yo tengo una pequena pbx Grandstream (UC1604), y 4 telefones SIP conectados a la central.
    Tenemos un portero electrico: http://www.hdl.com.br/produtos/interfonia/interfonia-residencial/porteiro-eletronico-f8-nt-az01.
    Que puedo hacer para abrir ese portero desde alguno de mis 4 telefonos SIP conectados a la central Grandstream. Desde ya, muchas gracias.

    ResponderEliminar
  21. Hi Max,

    Can I know more about your work? I'm doing a school project that require voice communication between a main control station with a few sub devices wirelessly. I intend to use all RPi for the main and slave devices. I have search the web but couldn't find anyone who did voice intercom via WiFi. could you help me in this?

    Thanks!

    ResponderEliminar
    Respuestas
    1. Either use this method or the Open Pi Project just replace the cable with a WiFi dongle.

      Eliminar
  22. Se puede usar un boton de un tibre viejo, el boton tiene luz? gracias

    ResponderEliminar
    Respuestas
    1. Puedes usar el boton que desees, solo ten cuidado con las entradas a ls puertos de la Raspberry.

      Eliminar
  23. Great project ! I followed the instructions and I made ​​a call to an extension by pressing a button . I was wondering how to route the call to an external number such as a cell phone number . What syntax should I use on the CLI ? Unfortunately I do not have a solid knowledge of Asterisk , however my asterisk server is well configured to handle a basic call traffic : incoming calls , internal calls , outcoming calls .

    ResponderEliminar
    Respuestas
    1. That depends on the technology that you are using. If you have a sip trunk set properly you only replace the Dial string for something like:

      Dial(SIP/yourtrunkname/thenumbertodial)

      Replace with the name of your trunk(isp) and the number that yoy want to dial.

      Eliminar
    2. Este comentario ha sido eliminado por el autor.

      Eliminar
    3. Thank you so much for your help! First of all, I forgot to specify that I can make calls to an extension using the following syntax:

      originate SIP/[one of my peers] extension [the number associated with peer in the extension.conf]

      and to my cell phone number with the following syntax:

      originate SIP/[mycellphonenumber]@[MyProvider]extension [theinternalexten]

      but not by using the "console dial" command (perhaps because the latest version of Asterisk installed on raspberry).
      If I make the call in this way, however, I'm not using the chan_alsa am I right? For now I'm doing the tests on a device without a USB soundcard, but once installed what should I do to handle the audio stream? I hope you can give me helpful tips! Thanks again!

      Eliminar
  24. Este comentario ha sido eliminado por el autor.

    ResponderEliminar