我在Linux Mint 13(Maya)中使用零食包,tk8.5(愿望)。
我的音频输出是带有 pulseaudio 软件的模拟立体声。
根据这一点:http://www.speech.kth.se/snack/tutorial.html 我只需要再次播放声音就可以了。
我有一个声音对象,无论我多少次调用 play 命令,它都只播放一次。
我尝试在播放前发出 stop 命令,如下所示:
mysound stop
mysound play
会发生什么:它在第一个但不在第二个呼叫上播放,在第三个呼叫上播放但在第四个呼叫上播放,然后继续播放。这是异步的,这意味着我按下按钮重复停止播放。现在,这个脚本:
包裹需要点心
snack::sound s
s read knock.wav
after 1000 {s play}; #play sound effect
after 5000 {s play}; #this one doesn't work
after 10000 {s play}; #this one doesn't work
after 15000 {s stop; s play}; #played
after 20000 {s stop; s play}; #not played
after 25000 {s stop; s play}; #played
与使用按钮释放事件时的行为相同。在Android中,行为完全按照理论工作,除了它根据设备有很大的延迟(例如,声音在一部手机中2秒后发出,而在另一部手机中发出200ms后声音更好)。
我知道理论是正确的,我最后的问题是:如何改进使用更健壮的声音播放的Linux实现?也许使用midi声音。可以在任何UNIX计算机上运行的解决方案。小吃能提供吗?
非常感谢你,因为这对我来说非常重要,我也相信其他人!
答案 0 :(得分:2)
不幸的是,你不能告诉我们你的系统是什么(你使用什么linux,你的音频系统和设备是什么)或者你真正在做什么。所以请提供一个最小的工作示例。
这是我的,这是互动的(我经常使用Tkcon)。
package require sound
snack::sound s1 -load longrunning-audio.wav
s1 play
# wait
s1 stop
s1 play
s1 pause
s1 pause; # resumes playing
我使用声音包而不是 snack ,因为我们不需要这里的图形元素。
作为剧本
#!/usr/bin/env tclsh
package require sound
snack::sound s1 -load longrunning-audio.wav
puts "play"; s1 play
after 4000 puts "stop" \; s1 stop
after 6000 puts "play" \; s1 play
after 10000 puts "pause" \; s1 pause
after 12000 puts "resume" \; s1 pause;
after 16000 {apply {{} {
puts "stop and exit"
s1 stop
exit
}}}
# start the event loop
vwait forever
after
在给定时间后以微秒为单位启动命令。在一个真实的程序中,你会使用一些程序,这里只是为了模拟一些交互。
也许你正在吃一个包装严重的零食或者你的音响系统和你玩傻瓜。我记得有些版本的pulseaudio与其中一个输出设备结合使用会遇到类似的问题。仅播放声音的开头,但音频系统保持活动状态(使用snack::audio active
显示当前状态)。
答案 1 :(得分:1)
after
电话本身只需要很少的时间。这意味着几乎同时发生了几次s play
的调用。你知道只有最后一个会产生任何影响吗?它实际上就像你这样做(在“从现在开始的1000毫秒”时间段):
s play
s play
s stop; s play
s stop; s play
s stop; s play
是的,他们有几个回调,但他们实际上会一个接一个地进行评估。你不会在他们之间看到任何时间。
我相信声音对象s
只能播放或不播放。此外,声音不会立即播放(显然),因此如果您想要听到声音,您必须留出时间从开始播放到停止播放。做你正在做的事情将导致在命令处理级别进行大量活动,但是没有那么多可以观察到。