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

📄 formplayer.java

📁 手机流媒体的实现
💻 JAVA
字号:
/**
//文档生成日期:2006.3.28
//
//(1)概述:
//类名称:FormPlayer
//类说明:
// 显示播放音乐的Form界面
    
//所在子系统:StreamingDemo
//
//系统总描述:
	用两个Player交替播放从网络上下载的流媒体。

	上面的代码可以从
	http://www.cnblogs.com/Files/zhengyun_ustc/StreamingDemo.rar
	下载;
	
	安装的jar包从
	http://www.cnblogs.com/Files/zhengyun_ustc/StreamingDemo-deployed.rar下载。
	
	本文属于讨论稿,提供的仅仅是建议和测试意见。
	本文还可以从
	http://www.cnblogs.com/zhengyun_ustc/archive/2006/3/28/StreamingDemo.html 得到最新稿。


//(2)历史记录:
//创建人: 郑昀(2006.3.28)
//修改历史:


//联系我: Google Talk >> zhengyun@gmail.com
//Blogs:    http://blog.csdn.net/zhengyun_ustc/以及http://www.cnblogs.com/zhengyun_ustc

//(3)版权声明:
//我这个版本j2me客户端代码仅仅允许您借鉴,但不得用于商业用途,除非得到郑昀本人的授权。本人保留所有权利。

////////////////////////////////////////////////////////////////////*/
package com.ultrapower.view;

import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.Form;
import javax.microedition.media.MediaException;
import javax.microedition.media.Player;
import javax.microedition.media.PlayerListener;

import com.ultrapower.common.CommandResources;
import com.ultrapower.control.GUIController;
import com.ultrapower.model.Audio;
import com.ultrapower.model.NonInteractiveGaugeRunnable;
import com.ultrapower.model.ThreadPlayMain;


/**********************************************************
//FormPlayer
//
//Author:
//zhengyun@ultrapower 2006.3.28
//
**********************************************************/
public class FormPlayer extends Form implements PlayerListener{
    private GUIController m_controller;
	
	/*
	 * 命令们
	 */
	private Command exitCommand; // The exit command
	private Command playCommand;
	
	/*
	 * 线程们
	 */
	public ThreadPlayMain m_threadMain;
	public ThreadPlayMain m_threadSecondary;
	
	/*
	 * 确定当前在播放哪一个Palyer
	 */
	private int m_nCurrentSequence = 0;
	
	/*
	 * 界面元素们
	 */
	private int m_nAppendGaugeId = -1;
	private NonInteractiveGaugeRunnable m_nonInteractive;
	
    
	public FormPlayer(String title, GUIController control){
		super(title);
		
		System.out.println("/** Enter FormPlayer Constructor!");
		
		m_controller	=	control;
    	this.setCommandListener(new FormListener());
    	
		exitCommand = new Command("退出应用(Exit)", Command.SCREEN, 4); 
		playCommand = new Command("重来一遍(Again)", Command.SCREEN, 2);
		this.addCommand(exitCommand); 
		this.addCommand(playCommand);

		// 同时显示进度条
		startGauge();
		
		// 创建两个线程;一个负责主播放器,一个负责从播放器
		StartPlayMain();
		StartPlaySecondary();
		
		try
		{
			// 首先启动Main Player去下载音乐和预加载音乐
			m_threadMain.notifyGetMusic();
			m_threadMain.notifyPrefetch();
			m_threadMain.notifyPlay();
			// 剩下的事情就靠GUIController的消息机制了
		}
		catch(Exception exc)
		{
			////////////////////////////////////////////
			// 告诉控制器出错了
			String strError = exc.getMessage() + "/" + exc.getClass();
			Object[] argvErrors = {strError};
			m_controller.handleEvent(GUIController.EventID.EVENT_FORM_ERROR, 
					argvErrors);
			////////////////////////////////////////////
		}
	}

	
	/*
	 * 启动Main音乐播放线程
	 */
	public final void StartPlayMain()
    {
		try
		{
			// 第三个参数0代表主播放器
			m_threadMain = new ThreadPlayMain(m_controller, this,
					0,
					CommandResources.SND_MAIN_MIN,
					CommandResources.SND_MAIN_MAX);
		    Thread thread;
		    (thread = new Thread(m_threadMain)).start();
		}
		catch(Exception exc)
		{
			////////////////////////////////////////////
			// 告诉控制器出错了
			String strError = exc.getMessage() + "/" + exc.getClass();
			Object[] argvErrors = {strError};
			m_controller.handleEvent(GUIController.EventID.EVENT_FORM_ERROR, 
					argvErrors);
			////////////////////////////////////////////
		}
    }	
	/*
	 * 启动Secondary音乐播放线程
	 */
	public final void StartPlaySecondary()
    {
		// 第三个参数1代表Secondary播放器
		m_threadSecondary = new ThreadPlayMain(m_controller, this,
				1,
				CommandResources.SND_SECONDARY_MIN,
				CommandResources.SND_SECONDARY_MAX);
	    Thread thread;
	    (thread = new Thread(m_threadSecondary)).start();
    }
	
	/*
	 * playSecondary函数总是由playerUpdate事件触发的;
	 * 当Main Player的音乐播放完毕,那么就立即播放Secondary Player的。
	 */
	public final void playSecondary()
    {
		m_threadMain.setPlaying(false);
		m_nCurrentSequence = 1;
		System.out.println("**play Secondary player!");
		m_threadSecondary.notifyPlay();
		
		try
		{
			m_controller.handleEvent(GUIController.EventID.EVENT_SECONDARY_BeginToPlay, 
					null);
		}
		catch(Exception e){
			e.printStackTrace();
		}
    }
	
	/*
	 * playMain函数总是由playerUpdate事件触发的;
	 * 当Secondary Player的音乐播放完毕,那么就立即播放Main Player的。
	 */
	public final void playMain()
    {
		m_threadSecondary.setPlaying(false);
		m_nCurrentSequence = 0;
		System.out.println("##play Main Player!");
		m_threadMain.notifyPlay();
		
		try
		{
			m_threadSecondary.notifyGetMusic();
			m_threadSecondary.notifyPrefetch();
		}
		catch(Exception e){
			e.printStackTrace();
		}
    }

	
	/*
	 * 进度条的函数
	 */
	public void startGauge()
	{
		if(m_nonInteractive == null)
		{
			System.out.println("new a NonInteractiveGaugeRunnable");
			m_nonInteractive = new NonInteractiveGaugeRunnable(
	                "I'm playing,please just wait...", 5, 0);
			new Thread(m_nonInteractive).start();
			m_nAppendGaugeId = this.append(m_nonInteractive);
		}
		else
		{
			System.out.println("active last NonInteractiveGaugeRunnable");
			m_nonInteractive.setValue(0);
			m_nonInteractive.setStart();
		}
	}	
	public void stopGauge()
	{
		if(m_nonInteractive != null)
			m_nonInteractive.setDone();
	}
	
	/*
	 * 通知Main音效和Secondary音效线程退出,之前要销毁音乐资源
	 */
	public void destroyMusic() throws MediaException
	{
		Audio.shutdown();
		m_threadMain.notifyCloseThread();
		m_threadSecondary.notifyCloseThread();
	}
	
	/*
	 * 本类实现了PlayerListener接口。通过这个事件来告知媒体已经播放完毕
	 */
	public void playerUpdate(Player player, String event, Object data){
		System.out.println("Enter playerUpdate>>" +
				event);
		
		if(event == PlayerListener.END_OF_MEDIA){
			try{
				System.out.println("playerUpdate>>PlayerListener.END_OF_MEDIA");
				stopGauge();
				
				if(m_nCurrentSequence == 0)
				{
					playSecondary();
				}
				else
				{
					playMain();
				}
				
				startGauge();				
			}catch(Exception e){
				e.printStackTrace();
			}
		}
		else if(event == PlayerListener.STOPPED)
		{
			System.out.println("playerUpdate>>PlayerListener.STOPPED");
		}
		else if(event == PlayerListener.STARTED)
		{
			System.out.println("playerUpdate>>PlayerListener.STARTED");
		}
	}

    /*
     * 内部监听器,监听器监听所有Command事件,并把事件响应推出来让控制器处理
     */
    private class FormListener implements CommandListener{ 
		public void commandAction(Command command, Displayable disp){
			if(command == exitCommand)
			{
				////////////////////////////////////////////
				// 告诉控制器exit
				m_controller.handleEvent(GUIController.EventID.EVENT_EXIT, 
						null);
				////////////////////////////////////////////
			}
			else if(command == playCommand)
			{
				// 通知背景音乐重新播放,不过可能需要稍等一会儿
				m_threadMain.notifyPlay();
				// 通知进度条继续跑
				startGauge();
			}
		}
    }//end inner class
    
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -