NokiaS60播放midi的问题

n5
博客专家认证
2006-01-20 05:20:36
播放一个较长的midi,在处于STARTED状态时,用stop & deallocate将它停掉,然后再用start从头播放。
但在nokia NGage/QD/7610/3230等机器中运行,无法听到声音。
如果将该Player close掉,再重新load另一个midi可以播放,但重新load刚被关掉的该midi则还是听不见声音。

谁遇到过这个情况,且解决了的,请发邮件到 happyfirecn@yahoo.com.cn
另外送分,越快越好!最多送500分!

谢谢!
...全文
307 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
n5 2006-02-05
  • 打赏
  • 举报
回复
谢谢各位发言,基本上这个问题可以确定是个bug了。如果谁能找出逆转这个bug的方法,那就中奖了,啊哈!
n5 2006-02-05
  • 打赏
  • 举报
回复
to xueyong1203(二当家的) :
你的stopMusic只是Pause掉,当调用PlayMusic时它是接着放的。这个我也试过了,是可以的。
我说得是stop后再调用deallocate,然后再start,理论上应该从头放的,(其他机子上是可以的),S60不行的说。(最近GBA的逆转裁判玩多了,说话有点那个,呵呵)
n5 2006-02-05
  • 打赏
  • 举报
回复
to (龙哥) :
状态之间的转换没有错的。况且如果违反了文档,在其他机子上也是不行的。
xueyong1203 2006-01-26
  • 打赏
  • 举报
回复
/**
* 播放背景音乐
*/
public void playMusic() {
try {
if (isMusic && midiPlayer != null) {
midiPlayer.start();
}
} catch (Exception ex) {
ex.printStackTrace();
}
}

/**
* 停止播放背景音乐
*/
public void stopMusic() {
try {
midiPlayer.stop();
} catch (Exception ex) {
ex.printStackTrace();
}
}

以上的代码在7610上是没问题的
PS:
QD和7650不是合并成一个系列,7650不支持midi,所以只能用数组吗?
贝壳鱼 2006-01-25
  • 打赏
  • 举报
回复
声音是令人头疼的问题。不同的机器会出现不同的效果
WuYL7812 2006-01-25
  • 打赏
  • 举报
回复
如果咱们在自己程序里写了midp文档里规定不应该写的东西,那结果就不可预料了

CLOSED state
Calling close on the Player puts it in the CLOSED state. In the CLOSED state, the Player has released most of its resources and must not be used again.

你找到这段话,是对player的描述,下面还画了个状态转换图,CLOSE是最终的状态,只能从其他状态转换到CLOSE状态,不能从CLOSE状态转到其他状态

根据midp文档,close()之后,就不能再使用了
WuYL7812 2006-01-25
  • 打赏
  • 举报
回复
我就
catch(Excetpion e)
{
}
然后就在里面用一个Alert把e.toString()显示出来,上面写的就是显示的结果,我用的是nokia6630

直接从文件怎么载入资源的
createPlayer("res://xxx.mid") ?

n5 2006-01-25
  • 打赏
  • 举报
回复
现在的情况是close掉再用createPlayer(从文件载入的那个)&start可以播放。(原来不行估计是哪儿弄错了)。
但stop&deallocate后,再start是无法播放的。(在其他手机上,如moto和samsung的一些手机都可以,所以只能认为是s60的一个bug)
虽然是bug,但也有可能通过某些特殊的方法处理掉(可以去forumNokia英文社区看看关于6230i的讨论)
所以我现在在寻找处理这个bug的方法。。

to 龙哥:
你说的“你那种写法“用stop & deallocate将它停掉,然后再用start从头播放”会抛出一个异常,media.MediaException: Symbian OS error: -5”,我在NokiaNgage,QD,7610,3230上都试过,没法播放是肯定的,但没有抛出异常,难道是因为我catch了异常的原因吗?但这些函数是throw异常的,所以我必须catch啊,你是怎么让它抛出异常的呢?

WuYL7812 2006-01-24
  • 打赏
  • 举报
回复
我用我的nokia 6630试了一下
我个人认为close掉,是没法重新从开始播放的,因为取得的资源是不支持reset的
资源的取得 Object.getClass().getResourceAsStream("url")取得的资源类型是InputStream
InputStream有个markSupported()方法,这样取得的资源markSupported返回false
就是调用reset无法回到资源的开头,无法重新播放的.
只有对这个资源调用close()之后,然后Object.getClass().getResourceAsStream("url")重新取得,重新createPlayer才能播放
这种说法是对的,而且你那种写法“用stop & deallocate将它停掉,然后再用start从头播放”会抛出一个异常,media.MediaException: Symbian OS error: -5

我试了一下如果不重载如资源,就无法重新播放

另外我看到midp文档里的一段话这样写着
CLOSED state
Calling close on the Player puts it in the CLOSED state. In the CLOSED state, the Player has released most of its resources and must not be used again.



WuYL7812 2006-01-24
  • 打赏
  • 举报
回复
个人认为要replay,输入的InputStream必须支持reset,就是markSupported()返回true
可以把取得资源里所有的数据读取到byte[]数组里,然后,用这个byte[]再创建一个ByteArrayInputStream,用这个stream作为播放资源,这样就可以replay了
但是你的midi比较大
WuYL7812 2006-01-24
  • 打赏
  • 举报
回复
你是如何load资源的
static Player createPlayer(String locator)
还是
static Player createPlayer(InputStream stream, String type)

player close掉后,你是如何reload这个资源的?

我个人认为close掉,是没法重新从开始播放的,因为取得的资源是不支持reset的
资源的取得 Object.getClass().getResourceAsStream("url")取得的资源类型是InputStream
InputStream有个markSupported()方法,这样取得的资源markSupported返回false
就是调用reset无法回到资源的开头,无法重新播放的.
只有对这个资源调用close()之后,然后Object.getClass().getResourceAsStream("url")重新取得,重新createPlayer才能播放
关于取得得资源调用reseet无效,我是试过的,调用read之后,调用reset,然后再调用read,取得的还是下一个字节
只是我的猜想,我今晚回去试试
n5 2006-01-23
  • 打赏
  • 举报
回复
3天了,怎么连顶的人都没有?
prok 2006-01-23
  • 打赏
  • 举报
回复
顶起来

13,100

社区成员

发帖
与我相关
我的任务
社区描述
Java J2ME
社区管理员
  • J2ME社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧