📄 audiorelay.java
字号:
/*
* AudioRelay.java
* Author: Naizheng Bian
* Version 1.0
* Created on November 23, 2001, 12:06:00 AM
*/
package serverPackage;
import java.util.*;
import java.awt.*;
import java.awt.event.*;
import java.net.*;
import java.io.*;
import java.net.InetAddress;
import javax.media.*;
import javax.media.protocol.*;
import javax.media.protocol.DataSource;
import javax.media.format.*;
import javax.media.control.TrackControl;
import javax.media.control.QualityControl;
import javax.media.rtp.*;
import javax.media.rtp.rtcp.*;
import javax.media.rtp.event.*;
import com.sun.media.rtp.*;
import javax.media.format.AudioFormat;
import javax.media.Format;
import javax.media.format.FormatChangeEvent;
import javax.media.control.BufferControl;
/** <P>
* <CODE>AudioRelay</CODE> is a Java class used to receive
* a audio stream fron the sender, and relay it to other
* audio receivers.
* </P>
*/
public class AudioRelay implements ReceiveStreamListener, SessionListener
{
// session information.
String sessions[] = null;
// Audio send stream manager.
RTPManager sRTPmgr;
// Audio receive stream manager.
RTPManager rRTPmgr;
// source and destination port for audio relay.
int sourcePort, destPort;
// Time to live constant.
int ttl = 6;
// variable used to test RTP connection.
boolean dataReceived = false;
// Syncronization object.
Object dataSync = new Object();
/** Creates a new instance of AudioRelay.
*/
public AudioRelay(int pb) {
try {
InetAddress ipAddr;
SessionAddress localAddr = new SessionAddress();
SessionAddress destAddr;
SessionAddress sourceAddr;
sourcePort = pb;
destPort = sourcePort + 10;
rRTPmgr = (RTPManager) RTPManager.newInstance();
rRTPmgr.addSessionListener(this);
rRTPmgr.addReceiveStreamListener(this);
localAddr = new SessionAddress( InetAddress.getLocalHost(),
sourcePort);
rRTPmgr.initialize( localAddr);
// You can try out some other buffer size to see
// if you can get better smoothness.
BufferControl bc = (BufferControl)rRTPmgr.getControl("javax.media.control.BufferControl");
if (bc != null) bc.setBufferLength(350);
sRTPmgr = (RTPManager) RTPManager.newInstance();
localAddr = new SessionAddress( InetAddress.getLocalHost(), destPort);
sRTPmgr.initialize( localAddr);
} catch (Exception e){
System.err.println("Cannot create the RTP Session: " + e.getMessage());
System.exit(0);
}
// Wait for data to arrive before moving on.
long then = System.currentTimeMillis();
long waitingPeriod = 30000; // wait for a maximum of 30 secs.
}
/**
* Close the players and the session managers.
*/
protected void close() {
rRTPmgr.removeTargets( "Closing receive session from AVReceive2");
rRTPmgr.dispose();
rRTPmgr = null;
sRTPmgr.removeTargets( "Closing send sessions from AVReceive2");
sRTPmgr.dispose();
sRTPmgr = null;
}
/**
* SessionListener.
* @param evt session event for RTP manager.
*/
public synchronized void update(SessionEvent evt) {
if (evt instanceof NewParticipantEvent) {
Participant p = ((NewParticipantEvent)evt).getParticipant();
}
}
/**
* ReceiveStreamListener.
* @param evt Received stream event for RTP manager.
*/
public synchronized void update( ReceiveStreamEvent evt) {
// RTPManager mgr = (RTPManager)evt.getSource();
Participant participant = evt.getParticipant(); // could be null.
ReceiveStream stream = evt.getReceiveStream(); // could be null.
if (evt instanceof RemotePayloadChangeEvent) {
System.err.println("Sorry, cannot handle payload change.");
System.exit(0);
}
else if (evt instanceof NewReceiveStreamEvent) {
try {
stream = ((NewReceiveStreamEvent)evt).getReceiveStream();
DataSource ds = stream.getDataSource();
// Find out the formats.
RTPControl ctl = (RTPControl)ds.getControl("javax.media.rtp.RTPControl");
// if (sendStream != null) sendStream.close();
// sendStream = null;
SendStream sendStream = ((RTPManager)sRTPmgr).createSendStream(ds, 0);
sendStream.start();
// Notify intialize() that a new stream had arrived.
} catch (Exception e) {
System.err.println("NewReceiveStreamEvent exception " + e.getMessage());
return;
}
}
else if (evt instanceof StreamMappedEvent) {
if (stream != null && stream.getDataSource() != null) {
DataSource ds = stream.getDataSource();
// Find out the formats.
RTPControl ctl = (RTPControl)ds.getControl("javax.media.rtp.RTPControl");
}
}
}
/*
public boolean isDone() {
System.err.println(" Waiting -------------------! ");
return false;
}
*/
/**
* Add a new user to the audio relay object.
* @param hostName IP address of the user.
*/
public void addUser(String hostName) {
InetAddress ipAddr;
SessionAddress destAddr;
SessionAddress sourceAddr;
try {
ipAddr = InetAddress.getByName(hostName);
sourceAddr = new SessionAddress( ipAddr, sourcePort);
destAddr = new SessionAddress( ipAddr, destPort);
rRTPmgr.addTarget(sourceAddr);
sRTPmgr.addTarget(destAddr);
} catch (Exception e) {
System.err.println("Failed to add the login user to the audio relay.");
}
}
/**
* Delete a user when user logoff.
* @param ipAddr IP address of the logoff user.
*/
public void deleteUser(InetAddress ipAddr) {
SessionAddress destAddr;
SessionAddress sourceAddr;
try {
sourceAddr = new SessionAddress( ipAddr, sourcePort);
destAddr = new SessionAddress( ipAddr, destPort);
rRTPmgr.removeTarget(sourceAddr, "User logout");
sRTPmgr.removeTarget(destAddr, "User logout");
} catch (Exception e) {
System.err.println("Failed to remove the current user from the audio relay.");
}
}
/**
* changeRelay the audio relay to another user.
* @param hostName The address of the user to be relayed.
*/
public void changeRelay(String hostName) {
InetAddress ipAddr;
SessionAddress destAddr;
SessionAddress sourceAddr;
try {
ipAddr = InetAddress.getByName(hostName);
sourceAddr = new SessionAddress( ipAddr, sourcePort);
rRTPmgr.removeTargets("Change relay to " + hostName);
rRTPmgr.addTarget(sourceAddr);
} catch (Exception e) {
System.err.println("Failed to change the audio relay.");
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -