linux - 声音在 tcl/tk 中只播放一次(snack、pulseaudio、Linux)

标签 linux unix tcl tk-toolkit pulseaudio

我在 Linux Mint 13 (Maya)、tk8.5 (wish) 中使用零食包。

我的音频输出是带有 pulseaudio 软件的模拟立体声。

据此:http://www.speech.kth.se/snack/tutorial.html 要再次播放声音,我所要做的就是再次使用播放命令。

我有一个声音对象,无论我调用 播放 命令多少次,它都只播放一次。

我尝试在播放前放置一个停止命令,如下所示:

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 秒后出现,而在另一部具有更好硬件的手机中则在 200 毫秒后出现)。

我知道这个理论是正确的,我的最后一个问题是:如何改进使用更强大声音播放的 Linux 实现?也许使用 MIDI 声音。可以在任何 UNIX 机器上运行的解决方案。零食提供吗?

非常感谢,因为这对我来说非常重要,我相信对其他人也一样!

最佳答案

不幸的是,您没有告诉我们您的系统是什么(您使用的是什么 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

我使用sound包而不是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 显示当前状态)。

关于linux - 声音在 tcl/tk 中只播放一次(snack、pulseaudio、Linux),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35957014/

相关文章:

linux - 终端中以非零代码退出的任何命令都会关闭我的终端窗口

linux - 授予特定用户对文件的访问权限

bash - 同时在屏幕和文件上显示标准输出

linux - UNIX - 使用 grep,如何过滤出现 n 次的模式?

linux - 期望 - telnet 连接

linux - 如何使用 %F bash shell 检测文件内容中的日期

java - 在远程服务器上的 linux 控制台中调试或跟踪 java 应用程序

c++ - C/C++ 程序是否可以通过读取数组末尾 (UNIX) 来产生段错误?

excel - 从 TCL 添加多列到 excel

java - Tcl 中的 System.currenttimemillis() 相当于什么