⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 audiorelay.java

📁 一个实现网络会议的软件.包含三个包.其中一个包需JMF的支持.
💻 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 + -