📄 threadplaymain.java
字号:
/*///////////////////////////////////////////////////////////////////////////////
//文档生成日期:2006.3.28
//
//(1)概述:
//类名称:ThreadPlayMain
//类说明:
// 发送httpConnection请求给我的服务器网页,这个网页会告诉我他看到的IP地址是什么
//所在子系统: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.model;
import java.io.InputStream;
import javax.microedition.media.MediaException;
import com.ultrapower.common.CommandResources;
import com.ultrapower.control.GUIController;
import com.ultrapower.view.FormPlayer;
/**********************************************************
//ThreadPlayMain
//
//Class Description:
//
//
//Author:
// zhengyun@ultrapower 2006.3.28
//
**********************************************************/
public class ThreadPlayMain
implements Runnable {
// 利用这个标志控制何时退出
private boolean m_bRunAnyway;
// 依靠这个标志判断是否需要去获取远程音乐
public boolean m_bGetMusic = false;
// 依靠这个标志判断是否需要去预加载音乐资源
private boolean m_bPrefetchIt = false;
// 依靠这个标志判断是否需要去播放音乐资源
private boolean m_bPlayIt = false;
private GUIController m_controller;
private FormPlayer m_form;
private int m_nSequenceMIN;
private int m_nSequenceMAX;
// 代表当前的播放器正在播放音乐,不允许当前线程再作其他的操作了
private boolean m_bPlaying = false;
// 代表播放器的数组序列号,0为第一个播放器
private int m_Sequence;
// 纪录当前正在下载哪一个音乐资源序号
private int m_nCurrentMusicIndex;
// 这是从网络上获取音乐数据的流
private InputStream m_isInputMusic;
/*
* MainOrSecondary指的是本线程代表哪一个播放器;共有两个播放器,一个Main,一个Secondary;
* 前者用0表示,后者是1;
*/
public ThreadPlayMain(GUIController control, FormPlayer form,
int MainOrSecondary,
int SequenceMIN,
int SequenceMAX)
{
System.out.println(MainOrSecondary +
">>>Enter ThreadPlayMain Constructor!");
m_controller = control;
m_form = form;
m_bRunAnyway = true;
m_Sequence = MainOrSecondary;
m_nSequenceMIN = SequenceMIN;
m_nSequenceMAX = SequenceMAX;
m_nCurrentMusicIndex = m_nSequenceMIN;
}
/*
* 允许外界设置当前是否在播放
*/
public void setPlaying(boolean bPlaying)
{
m_bPlaying = bPlaying;
}
/*
* 通知当前播放器停止播放音乐
*/
public synchronized void notifyStop() throws MediaException
{
m_bPlayIt = false;
m_bPrefetchIt = false;
// 停止音乐播放
Audio.stopSound(m_Sequence);
}
/*
* 通知下载音乐片段
*/
public synchronized void notifyGetMusic()
{
m_bGetMusic = true;
}
/*
* 通知线程退出
*/
public synchronized void notifyCloseThread()
{
m_bPlayIt = false;
m_bPrefetchIt = false;
m_bRunAnyway = false;
}
/*
* 当前的播放器准备数据
*/
public synchronized void notifyPrefetch()
{
m_bPrefetchIt = true;
}
/*
* 当前的播放器应该数据已经准备好了,那么就播放他
*/
public synchronized void notifyPlay()
{
m_bPlayIt = true;
}
public final void run()
{
/* Use networking if necessary */
long lngStart;
long lngTimeTaken;
try
{
while(m_bRunAnyway)
{
if(m_bGetMusic && !m_bPlaying)
{
System.out.println(m_Sequence +
">>>ready to get remote music.m_nCurrentMusicIndex="
+ m_nCurrentMusicIndex);
m_isInputMusic =
CommandResources.getMusicResource(m_nCurrentMusicIndex);
m_nCurrentMusicIndex =
(m_nCurrentMusicIndex<m_nSequenceMAX)?
(m_nCurrentMusicIndex+2):m_nSequenceMAX;
// 下载过了就递增2
// 下载完毕就不再下载了,等待下次通知
m_bGetMusic = false;
System.out.println(m_Sequence +
">>>download completed!");
if(m_Sequence == 0)
{
m_controller.handleEvent(GUIController.EventID.EVENT_MAIN_DownloadCompleted,
null);
}
}
if( m_bPrefetchIt && !m_bPlaying)
{
System.out.println(m_Sequence +
">>>Start prefetch!");
String strError = "";
boolean bHasException = false;
try
{
Audio.prefetchSound(m_form,
m_isInputMusic,
m_Sequence);
}
catch(Exception exc)
{
bHasException = true;
exc.printStackTrace();
strError =
"Exception:"
+ exc.getMessage() +
"/" + exc.getClass();
}
if(bHasException == true)
{
////////////////////////////////////////////
// 告诉控制器出错了
Object[] argvErrors = {strError};
m_controller.handleEvent(GUIController.EventID.EVENT_FORM_ERROR,
argvErrors);
////////////////////////////////////////////
}
m_bPrefetchIt = false;
}
if( m_bPlayIt && !m_bPlaying)
{
System.out.println(m_Sequence +
">>>Start play!");
String strError = "";
boolean bHasException = false;
try
{
m_bPlaying = true;
Audio.playSound(m_Sequence);
}
catch(Exception exc)
{
bHasException = true;
exc.printStackTrace();
strError =
"Exception:"
+ exc.getMessage() +
"/" + exc.getClass();
}
if(bHasException == true)
{
////////////////////////////////////////////
// 告诉控制器出错了
Object[] argvErrors = {strError};
m_controller.handleEvent(GUIController.EventID.EVENT_FORM_ERROR,
argvErrors);
////////////////////////////////////////////
}
m_bPlayIt = false;
}
lngStart = System.currentTimeMillis();
lngTimeTaken = System.currentTimeMillis() - lngStart;
if(lngTimeTaken < 100)
Thread.sleep(75 - lngTimeTaken);
}
}
catch(Exception exc)
{
System.out.println(m_Sequence +
">>>Eception in downloading!");
m_bRunAnyway = false;
exc.printStackTrace();
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -