ELO-330: Programación de Sistemas
Tarea 4: Chat de audio

Objetivos: En esta tarea usted aplicará: comunicación entre procesos remotos usando C y Java, manejo de hebras en ambos lenguajes, acceso sincronizado de variables en Java, integración de servicios provistos por otras aplicaciones.

Introducción

En esta tarea dos procesos permitirán que usuarios tengan una comunicación de audio sencilla a través de la red. 

Nombre:  audioMix:  programa Java, mezclador de flujos de audio
audioTerminal: programa en C, capturador y reproductor de audio

Sintaxis: audioMix <puerto>
  audioTerminal <server> <puerto>
 
puerto: es el número de puerto del servidio de mezcla de flujos de audio en el servidor audioMix.
server: es un nombre o IP del computador donde corre audioMix.

Descripción
 
Un servidor Java hará mezclará flujos de audio provenientes de diferentes clientes. Un diseño basado en hebras de este servidor le permiten atender sin mayor latencia a todos los clientes y recibir nuevos clientes. Clientes corriendo en el computador de cada usuario toman el flujo de audio proveniente del micrófono y lo envía al servidor. Una hebra independiente del cliente recibe un flujo desde el servidor y los reproduce en la salida de audio del computador (parlante).
  La comunicación entre cliente y servidor es vía TCP. Desde su inicio el cliente captura regularmente paquetes (por ejemplo de 320 muestras de audio) desde el micrófono y las envía hacia el servidor. El servidor por su parte lee paquetes desde los clientes, y envía a cada cliente un único flujo de datos con todos los flujos de los clientes excepto el del cliente destinatario de esa mezcla. Use codificación lineal de 16 bits para las muestras de audio, así la mezcla puede realizarse a través de una suma normal de enteros de 16 bits.
  Tanto el programa cliente como el servidor concluyen con control-C. El servidor sigue operando en la medida que tenga clientes que atender, no impportanto que algunos se retiren y otros ingresen.
  Esta aplicación no ofrece mecanismos para cambios de sensibilidad del micrófono ni volumen de parlante. Tampoco hay detección de silencio. La aplicación supone que tantoo el cliente como servidor son ejecutados en arquitectura little-endian (Intel convention).

Evaluación de la Tarea y qué entregar: revisar las instrucciones para entregar y evaluar su tarea.

Recomendaciones

* En cliente use arecord y aplay para hacer captura y reproducción. Como formato puede probar con arecord --format=S16_LE -t raw
* En una primera etapa se recomienda desarrollar el cliente y un servidor sencillo (sólo atiende a dos clientes y lo que llegue por uno lo envía a otro), luego usted puede extender al servidor para manejar múltiples clientes.
* Para probar usted puede generar un archivo de audio con arecord y luego usarlo en una versión especial del cliente para no estar hablando en cada una de sus pruebas.
* Usted puede corrrer varias instancias de su cliente, usando archivos de audio como entrada, para probar todo en un único computador.
* Pruebe su solución final corrriendo audioMix en aragorn y algunos clientes en uno o varios computadores.
* Si más aclaraciones son requeridas, con todo gusto lo atenderé.