• 完美解决Java程序在 MOTO E680i 中声音文件播放


    这几天一直在用MOTO SDK来开发一款用于Moto E680i的JAVA游戏,利用BLOG发表一些心得:

    MOTO系列手机中JAVA程序播放一个声音文件比较简单,但是用于交互式音效时就有问题了。

    根据MOTO的一些资料显示,在MOTO手机中播放声音有下面几条约束:

    除了同时播放一个MIDI和一个WAV以外,MOTO手机无法同时播放多个声音,而且必须是先播放MIDI然后播放WAV;

    除了MIDI或音阶序列以外,不能同时实现player的多个实例进入prefetched状态(预读取声音流);

    播放新的声音之前,前一个player必须停止并释放资源(stop();deallocate())。

    如果你遇到以下问题,可以试试我的解决方法:

    1)只能播一次,或几次,接着就无法发出声音;

    2)播放新的声音时,总是会多播放一次前一个声音;

    3)或者其他奇怪的问题。

    我的代码:

    //引用以下
    import javax.microedition.media.Player;
    import javax.microedition.media.PlayerListener;

    //定义多个声效及声音文件的类型
     private String[] arrSoundFile = {"start.mid","right.wav","wrong.wav","help.wav","end.wav"};
     private String[] arrSoundType = {"audio/x-midi","audio/x-wav","audio/x-wav","audio/x-wav","audio/x-wav"};

    //定义播放器实例
     public Player player;

    //定义一个变量,控制是否发声
      public boolean isSoundOpen = false;

    //播放声音主过程,参数为前面定义的声音数组的索引号
      public void playMedia(int iKey) throws Exception {

        // 创建实例
        player = Manager.createPlayer(
            getClass().getResourceAsStream("/midi/"+arrSoundFile[iKey]), arrSoundType[iKey]);

        // 绑定状态更新事件过程
        player.addPlayerListener(this);

        //播放声音
        player.setLoopCount(1); 
        player.prefetch(); // prefetch
        player.realize(); // realize
        player.start(); // and start
      }

    // 播放器状态更新事件过程
     public void playerUpdate(Player player, String event, Object eventData) {

        //调试 跟踪过程
        //    System.err.println("event:" + event);

        //如果播放结束,就释放和关闭播放器实例
        if (event.equals("endOfMedia")) {
        player.deallocate();
        player.close();
        }
    }

    //播放声音调用过程
     public void playSound(int iKey) {
       if(isSoundOpen)
      {
           try {
              playMedia(iKey);
            } catch (Exception e) {
              System.err.println("Unable to play: " + e);
              e.printStackTrace();
            }
          }
    }

    /*
    欢迎转载,请保留以下版权说明
    ========================
      风雨雷电堂在学J2ME
    ========================
    不保留以上版权说,说明你很差
    */

    大家可以在MOTO的机子上测试。

  • 相关阅读:
    Linux:Day7(上) find、文件特殊权限、if语句
    Linux:Day6(下) vim编辑器
    Linux:Day6(上) egrep、条件测试
    Linux:Day5 shell编程初步、grep
    Linux:Day4(下) 用户及组管理
    Linux中的cat、more、less、head、tail命令
    ajax中的contendType和dataType知识点梳理
    Django使用jsonp和cors解决跨域请求问题
    Django的Modelforms的介绍
    Django的Rbac介绍3
  • 原文地址:https://www.cnblogs.com/gpwzw/p/12147505.html
Copyright © 2020-2023  润新知