【问题标题】:Playing Sound in Perl script在 Perl 脚本中播放声音
【发布时间】:2012-10-01 08:30:41
【问题描述】:

我正在尝试向 Perl 脚本添加声音以提醒用户事务正常(用户在工作时可能不会一直看着屏幕)。我希望尽可能保持可移植性,因为该脚本在 Windows 和 Linux 站上运行。
我可以

use Win32::Sound;
Win32::Sound::Play('SystemDefault',SND_ASYNC);

适用于 Windows。但我不确定如何在 Linux (Gnome) 上调用通用声音。到目前为止,我想出了

system('paplay /usr/share/sounds/gnome/default/alert/sonar.ogg');

但我不确定我是否可以指望这条可用的路径。
所以,三个问题:

  1. 有没有更好的方法在 Gnome 中调用默认声音
  2. 这条路径是否相当普遍(至少在 Debain/Ubuntu 风格中)
  3. paplay播放声音后需要一段时间退出,有没有更好的调用方式?

我宁愿远离系统扬声器发出哔哔声,这听起来很糟糕(这会被播放很多次)而且 Ubuntu 还是将 PC 扬声器列入黑名单。
谢谢!

【问题讨论】:

    标签: windows perl audio portability gnome


    【解决方案1】:

    获取paplay 的路径(假设它在那里)的更便携方法可能是使用File::Which。然后你可以得到这样的路径:

    use File::Which;
    my $paplay_path = which 'paplay';
    

    并且要异步播放声音,你可以fork一个子进程:

    my $pid = fork;
    if ( !$pid ) { 
        # in the child process
        system $paplay_path, '/usr/share/sounds/gnome/default/alert/sonar.ogg';
    }
    
    # parent proc continues here
    

    还请注意,我使用了system 的多参数形式;这样做可以避免 shell 并直接运行请求的程序。这避免了危险的错误(并且效率更高。)

    【讨论】:

    • 我在想fork,但我不确定这是否会导致更多问题被重复调用。我会试一试。谢谢!
    • 另外,我指的是可以播放的声音文件的路径(不是paplay 本身)。但我认为这是相同的想法,我会 (-R $path) 直到找到一个可行的方法。
    • 另外,我正在用 Perl/Tk 编写这个。 fork 必须明确调用 CORE::exit()POSIX::_exit() 否则会发生可怕的事情。
    猜你喜欢
    • 2023-01-23
    • 1970-01-01
    • 2013-07-04
    • 1970-01-01
    • 2011-05-25
    • 1970-01-01
    • 2013-04-20
    • 1970-01-01
    • 2010-10-17
    相关资源
    最近更新 更多