import java.net.InetAddress;
import javax.media.rtp.RTPManager;
import javax.media.rtp.SessionAddress;
import javax.media.control.BufferControl;

//clase que implementa un receptor de audio
public class ReceptorAudio extends Receptor
{
	//constructor de la clase
	public ReceptorAudio(Target destino)
	{
		//inicializamos las variables
		super(destino);

		//añadimos el destino remoto
		System.out.println(Misc.ind() + "Creando destino");
		Misc.aumentarInd();
		addTarget();
		Misc.reducirInd();
		System.out.println(Misc.ind() + "Destino creado");
	}

	//método que crea un destino remoto
	public void addTarget()
	{
		try
		{
			InetAddress ipAddr;
			SessionAddress localAddr;
			SessionAddress destAddr;

			//creamos un manejador RTP
			System.out.println(Misc.ind() + "Creando el manejador RTP");
			rtpManager = RTPManager.newInstance();
			rtpManager.addSessionListener(this);
			rtpManager.addReceiveStreamListener(this);
			rtpManager.addRemoteListener(this);

			//Obtenemos la dirección IP des destino a partir de una cadena
			System.out.print(Misc.ind() + "Obteniendo IP del destino: ");
			ipAddr = InetAddress.getByName(destino.ipRemota());
			System.out.println(ipAddr.getHostAddress());

			//Obtenemos el puerto remoto
			System.out.print(Misc.ind() + "Obteniendo puerto remoto: ");
			int remotePort= new Integer(destino.puertoAudioRemoto()).intValue();
			System.out.println(remotePort);

			//Creamos una sesion local usando el puerto remoto
			System.out.println(Misc.ind() + "Creando sesion local: " + destino.ipLocal() + ":" + remotePort);
			localAddr = new SessionAddress(InetAddress.getByName(destino.ipLocal()), remotePort);

			//Creamos una sesión remota usando el puerto remoto
			System.out.println(Misc.ind() + "Creando sesion remota: " + ipAddr.getHostAddress() + ":" + remotePort);
			destAddr = new SessionAddress(ipAddr, remotePort);

			//inicializamos el manejador RTP
			System.out.println(Misc.ind() + "Inicializando el manejador RTP");
			rtpManager.initialize(localAddr);

			//Cambiamos el tamaño del buffer
			System.out.println(Misc.ind() + "Cambiando el tamano del buffer a " + BUFFERLEN + "msg");
			BufferControl bc = (BufferControl)rtpManager.getControl("javax.media.control.BufferControl");
			if (bc != null)
			{
				bc.setBufferLength(BUFFERLEN);
			}

			//añadimos la dirección del destino al manejador RTP
			System.out.println(Misc.ind() + "Anadiendo destino");
			rtpManager.addTarget(destAddr);
		}
		//capturamos la excepcion
		catch (Exception e)
		{
			System.err.println(Misc.ind() + "No se pudo crear la sesion RTP: " + e.getMessage());
			return;
		}
	}
}
