2012-10-10 41 views
6

我正在嘗試向Perl腳本中添加聲音以提醒用戶事務正常(用戶可能無法在工作時始終查看屏幕)。我希望保持儘可能的便攜性,因爲腳本在Windows和Linux工作站上運行。
我可以在Perl腳本中播放聲音

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

爲Windows。但我不確定如何在Linux(Gnome)上調用通用聲音。到目前爲止,我已經拿出

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

但我不知道如果我可以指望可用的路徑。
所以,三個問題:

  1. 是否有更好的方法來調用默認的聲音侏儒
  2. 是路徑相當普遍的(其中的Debain/Ubuntu的味道至少)
  3. paplay需要一段時間才能在播放聲音後退出,有沒有更好的方法來調用它?

我寧願遠離系統揚聲器發出嗶嗶聲,這聽起來很糟糕(這會發揮很大的作用),而且Ubuntu會將PC發言人列入黑名單。
謝謝!

回答

3

更便捷的方式獲取路徑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並直接運行所需的程序。這可以避免危險的錯誤(並且效率更高)。

+0

我在考慮'fork',但我不確定這是否會導致更多的問題被重複調用。我會試一試。謝謝! – charlesbridge

+0

另外,我的意思是聲音文件的路徑,我可以指望可以播放(而不是'paplay'本身)。但我認爲這是一樣的想法,我只是(-R $路徑),直到我找到一個可行的。 – charlesbridge

+0

另外,我正在用Perl/Tk編寫它。 'fork'必須顯式調用'CORE :: exit()'或'POSIX :: _ exit()'或發生可怕的事情。 – charlesbridge