`
wuce7758
  • 浏览: 177974 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论
  • YTT1121: 有网络拓扑发现的源代码么?能不能发我一份学习一下,现在我正要做 ...
    java拓扑图
  • YTT1121: 大神,有网络拓扑发现的源代码么?或者您会编写么?我需要做科研改 ...
    java拓扑图
  • YTT1121: 大神,有网络拓扑发现的源代码么?或者您会编写么?我需要做科研改 ...
    java拓扑图
  • poettang: 求代码分享学习,谢谢!膜拜大神!258026921@qq.co ...
    java拓扑图
  • oiqio: 87836238@qq.com,感谢楼主,来一份~
    java拓扑图

高效的Java音乐播放类

阅读更多

/** *//**
     * 自动播放,循环停止后结束。
     * 
     * 
@return
     
*/

    
public boolean AutoPlay() ...{
        _isRun 
= true;
        _thread 
= new Thread(this);
        _thread.start();
        
return _playing;
    }


    
/** *//**
     * 停止播放
     
*/

    
public void stop() ...{

        
if (_audio != null && _audio.isActive()) ...{
            
try ...{
                _audio.stop();
            }
 catch (Exception e) ...{
            }

        }


        
if (_midi != null...{
            _midi.stop();
        }

        _playing 
= false;
        _isRun 
= false;
    }


    
/** *//**
     * 释放数据
     * 
     
*/

    
public void reset() ...{

        stop();

        _loop 
= false;
        _soundType 
= 0;

        
if (_midi != null...{

            _midi.close();

            _midi 
= null;

        }


        
if (_audio != null && _audio.isOpen()) ...{

            _audio.close();

            _audio 
= null;

        }

        _isRun 
= false;
        _thread 
= null;
    }


    
/** *//**
     * 设定MetaMessage
     
*/

    
public void meta(MetaMessage meta) ...{
        
// 判断是否循环播放MIDI
        if (_loop && _soundType == SoundData._L_SOUNDTYPE_MIDI
                
&& meta.getType() == 47...{

            
if (_midi != null && _midi.isOpen()) ...{
                _midi.setMicrosecondPosition(
0);
                _midi.start();

            }

        }


    }


    
public void run() ...{
        
while (_isRun) ...{
            play();
            
// 因为播放类型唯一,所以只会返回一个_playing结果,以此判定。
            if (_midi != null...{
                _playing 
= _midi.isRunning();
            }

            
if (_audio != null...{
                _playing 
= _audio.isRunning();
            }

            
// 当播放停止
            if (!_playing) ...{
                
// 释放
                reset();
            }

            
try ...{
                Thread.sleep(_sleepTime);
            }
 catch (InterruptedException e) ...{
                e.printStackTrace();
            }

        }

    }


    
public int getSleepTime() ...{
        
return _sleepTime;
    }


    
/** *//**
     * 设定AutoPlay线程循环时间。
     * 
     * 
@param time
     
*/

    
public void setSleepTime(int time) ...{
        _sleepTime 
= time;
    }

}


这时我们需要面对的,仅是封装为实体的SoundData数据和SoundPlay操作,而不必和繁复的javax.sound再打交道。

调用方法如下:

package org.test;

import org.loon.framework.game.helper.StreamHelper;
import org.loon.framework.game.net.URI;
import org.loon.framework.game.sound.SoundData;
import org.loon.framework.game.sound.SoundPlay;

/** *//**
 * <p>Title: LoonFramework</p>
 * <p>Description:SoundPlay播放测试</p>
 * <p>Copyright: Copyright (c) 2007</p>
 * <p>Company: LoonFramework</p>
 * 
@author chenpeng  
 * @email:ceponline@yahoo.com.cn 
 * 
@version 0.1
 
*/

public class SoundPlayTest ...{

    
static void selectPlay(int ftype)...{
        SoundData data
=null;
        
        
switch(ftype)...{
        
//通过loonframework下uri从网络播放音乐
        case 0:
            data
=new SoundData(new URI("http://looframework.sourceforge.net/midi/谁是大英雄.mid"),SoundData._L_SOUNDTYPE_MIDI,false);
            
break;
        
//通过本地资源下音乐文件的byte[]对象播放音乐
        case 1:
            
byte[] bytes=StreamHelper.GetResourceData("/midi/谁是大英雄.mid");
            data
=new SoundData(bytes,SoundData._L_SOUNDTYPE_MIDI,false);
            
break;
            
//通过音乐文件路径播放音乐    
        case 2:
            data
=new SoundData("C:/谁是大英雄.mid",SoundData._L_SOUNDTYPE_MIDI,false);
            
break;
        }

        SoundPlay play
=new SoundPlay();
        
//AutoPlay与Play方法的区别在于,AutoPlay播放完毕会自动停止并释放资源,play需手动中止。
        
//play.play(data);
        play.AutoPlay(data);
    }

    
    
public static void main(String[]args)...{
        selectPlay(
2);
    }

    
}




更详细方法,会待Loonframework-game完全公布后,再进行解释。

另:由于StreamHelper关联其他Loonframework中方法,暂不给出,inputStream转byte[]可用如下写法:

//is为获得的inputStream

   ByteArrayOutputStream byteArrayOutputStream 
= new ByteArrayOutputStream();
//用于承接byte[]
        byte[] arrayByte = null;
        
try ...{
            
// 每次传输大小为4096
            byte[] bytes = new byte[4096];
            bytes 
= new byte[is.available()];
            
int read;
            
while ((read = is.read(bytes)) >= 0...{
                byteArrayOutputStream.write(bytes, 
0, read);
            }

            arrayByte 
= byteArrayOutputStream.toByteArray();
        }
 catch (IOException e) ...{
            
return null;
        }
 finally ...{
            
try ...{
                
if (byteArrayOutputStream != null...{
                    byteArrayOutputStream.close();
                    byteArrayOutputStream 
= null;
                }

                
if (is != null...{
                    is.close();
                    is 
= null;
                }


            }
 catch (IOException e) ...{
            }

        }
分享到:
评论

相关推荐

    java源码包---java 源码 大量 实例

     Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系,这些代码面向初级、中级Java程序员。 Java访问权限控制源代码 1个目标文件 摘要:Java源码,...

    java_jsp项目源码_音乐网站(+SERVLET)130222.rar

    本音乐网站是一个基于Java JSP和SERVLET技术的在线音乐平台,提供了丰富的音乐资源和高...总之,本音乐网站是一个集音乐播放、管理、推荐和定制于一体的综合性在线音乐平台,为用户提供了便捷、高效的音乐服务体验。

    java源码包4

     Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系,这些代码面向初级、中级Java程序员。 Java访问权限控制源代码 1个目标文件 摘要:Java源码...

    java源码包3

     Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系,这些代码面向初级、中级Java程序员。 Java访问权限控制源代码 1个目标文件 摘要:Java源码...

    JAVA上百实例源码以及开源项目源代码

     Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系,这些代码面向初级、中级Java程序员。 Java访问权限控制源代码 1个目标文件 摘要:Java源码,...

    JAVA上百实例源码以及开源项目

     Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系,这些代码面向初级、中级Java程序员。 Java访问权限控制源代码 1个目标文件 摘要:Java源码,...

    java源码包2

     Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系,这些代码面向初级、中级Java程序员。 Java访问权限控制源代码 1个目标文件 摘要:Java源码...

    计算机毕业设计:Java实现的音乐管理系统(SpringBoot+Vue,源码+详细说明),保证可靠运行,赠计算机答辩PPT模版

    《计算机毕业设计:Java实现的音乐管理系统》是一项融合创新与实践的优质学术资源,它采用了SpringBoot与Vue.js的前沿技术,构建了一个功能丰富、交互友好的音乐管理平台。该资源不仅提供了完整的源码和详尽的说明...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行ATM机...

    基于Java的在线音乐网站协同过滤推荐算法设计源码

    本项目是一个基于Java语言开发的在线音乐网站,包含222个文件,主要文件类型包括Java类文件、Java源代码、XML配置文件、JSP页面、图片、JavaScript脚本、属性文件、CSS样式表和Idea缓存文件。系统设计旨在为用户提供...

    JAVA上百实例源码以及开源项目源代码 java开源包2

    2个目标文件,FTP的目标是:(1)提高文件的共享性(计算机程序和/或数据),(2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变化,(4)为了可靠和高效地传输,虽然用户...

    成百上千个Java 源码DEMO 3(1-4是独立压缩包)

    Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行ATM机...

    基于Java-web的音乐网站的设计与实现论文

    随着互联网和宽带上网的普及,网络传输以其特有的快速、高效、便捷的传 输方式越来越被人们接受。在当今社会的影响下,人们因为快节奏的工作和生活 产生了极大的压力,这时就需要一个放松的环境去释放这些压力,因此...

    音乐网站(JSP+SERVLET).zip

    基于JSP(Java Server Pages)和Servlet技术的音乐网站,通过其高效、稳定的技术架构,为用户提供了一个丰富、便捷的音乐体验空间。 JSP作为Java Web开发的核心技术之一,负责动态生成网页内容。在音乐网站中,JSP...

    Java毕业设计:基于SpringBoot的儿童音乐赏析网站(源码+文档+录像演示).zip

    本系统前端使用JQuery框架对DOM操作,后端代码使用Java语言编写的,高效快速。数据库管理系统使用开源软件MYSQL,节约成本。该系统页面简洁,能够让浏览系统的用户快速查询到自己想要获得的信息,并做出相应的处理。...

    基于Uni-app和Node的音乐听歌系统项目(免费提供全套java开源项目源码+论文+ppt+软件+使用说明)

    在数字音乐消费快速增长的背景下,提供一个高效、便捷、并具备高度定制化的音乐听歌系统显得尤为重要。本项目旨在开发一个基于Uni-app和Node技术的音乐听歌系统,满足不同用户的音乐收听与管理需求。该系统不仅支持...

    【计算机毕业设计】5.音乐网站及周边产品运营系统vue源码

    音乐流媒体播放及周边产品运营的信息服务管理系统能够通过互联网得到广泛的、全面的宣传,让尽可能多的用户了解和熟知音乐流媒体播放及周边产品运营的信息服务管理系统的便捷高效,不仅为群众提供了服务,而且也推广...

Global site tag (gtag.js) - Google Analytics