📄 formplayer.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 + -