搜索
查看: 343|回复: 2

请教一下循环多次播放声音文件只播放一次的问题

[复制链接]

1

主题

2

帖子

16

积分

新手入门

Rank: 1

积分
16
发表于 2018-9-7 11:24:31 | 显示全部楼层 |阅读模式
程序里面有个提示的功能,需要播放声音,然后设置了循环播放n次,例如是3,可是循环后只有一次播放
尝试用线程播放,发现干脆没声音了,没研究出什么地方出错了,看了Jacen的关于线程的那个帖子,还是没能弄好
  1. import win.ui;
  2. import web.form;
  3. import crypt;

  4. import fsys;
  5. import fsys.media;
  6. import win.util.tray;//导入汽球提示支持库

  7. import time;
  8. import fsys.file;
  9. import thread;


  10. /*DSG{{*/
  11. var winform = win.form(text="miniblink";right=1174;bottom=839;width=1920)
  12. winform.add(
  13. button={cls="button";text="声音测试";left=1009;top=807;right=1170;bottom=837;z=4};
  14. custom={cls="custom";text="custom";left=6;top=-51;right=1170;bottom=789;db=1;dl=1;dr=1;dt=1;z=1};
  15. edit={cls="edit";left=875;top=3;right=1168;bottom=566;db=1;dr=1;dt=1;edge=1;multiline=1;z=2};
  16. edit2={cls="edit";text="Edit";left=876;top=581;right=1168;bottom=625;edge=1;multiline=1;z=3}
  17. )
  18. /*}}*/

  19. winform.button.oncommand = function(id,event){ //事件必须放在show之前
  20.         thread.invoke(t_alert,winform)
  21.         //t_alert(5);  //此处直接调用可以播放声音,但是只有播放一次
  22.         /*thread.create(function(winform){
  23.                 winform.t_alert(3);
  24.         },winform)*/
  25. }

  26. t_alert=function(num=3){ //播放声音提醒

  27.    for(i=1;num;1){
  28.           
  29.    fsys.media.playSound("\res\v.wav",0x1/*_SND_ASYNC*/);
  30.    
  31.    }
  32.         win.util.tray(winform).pop( "OK" ) //看看节点取的是否正确
  33.    
  34. }

  35. thread.invoke(t_alert)


  36. winform.show();
  37. win.loopMessage();
复制代码



谢谢帮助
回复

使用道具 举报

185

主题

2541

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
13973
发表于 2018-9-7 12:39:08 | 显示全部楼层
你不是循环播放多次声音,而是同时播放多个声音,一张嘴不能同时说3句话,playSound也一样。你也没有到线程里播放声音,只是在线程里发了指令又去调用界面线程的函数 - 犯了同样的错误。

你也没怎么“研究”过 - 当然也就研究不出结果,至少能看出来你没有看过fsys.media的文档以及微软相关接口的文档 。
要想循环播放,可以使用 media.play("wait") 等上一次播放结束再 media.seek(1) 回到开始重新播放,这个就好像人吃饭,你要吃三碗,得等第一碗吃完了再吃下一碗,而不是三碗饭往嘴里一倒:咦.........明明循环给你喂了三碗,你怎么才吃了一口就不行了?!

例子:
import win.ui;
/*DSG{{*/
var winform = win.form(text="aardio form")
winform.add(
button={cls=
"button";text="循环播放声音";left=213;top=168;right=514;bottom=304;z=1}
)
/*}}*/

winform.button.oncommand =
function(id,event){
   
    thread.invoke(
        
function(){
            
            
import fsys.media;
            
var media = fsys.media("\test.wav");
            
for(i=1;3;1){
                media.play(
"wait")  
                media.seek(1);
            }
            media.close()   
        }
    )
}

winform.show();
win.loopMessage();


回复

使用道具 举报

1

主题

2

帖子

16

积分

新手入门

Rank: 1

积分
16
 楼主| 发表于 2018-9-7 13:26:50 | 显示全部楼层
Jacen.He 发表于 2018-9-7 12:39
你不是循环播放多次声音,而是同时播放多个声音,一张嘴不能同时说3句话,playSound也一样。你也没有到线程 ...

谢谢Jacen回复。

吃饭的比喻非常形象,受教了。

其实fsys.media的确是看了,不过看了playsound那里就没看下面的了,非常惭愧。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

手机版|未经许可严禁引用或转载本站文章|站长邮箱|aardio.com|aardio官方社区 ( 皖ICP备09012014号 )

GMT+8, 2018-10-22 04:49 , Processed in 0.093750 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表