2012-10-10 8 views
6

私はPerlスクリプトにサウンドを追加して、トランザクションがOKであることをユーザーに警告しています(作業中は常に画面を見ていないかもしれません)。スクリプトはWindowsとLinuxのステーションで実行されるので、私はできるだけポータブルにしておきたいと思います。 Windows用
私はできPerlスクリプトでサウンドを再生する

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

。しかし、私はLinux(Gnome)で一般的なサウンドを呼び出す方法がわかりません。これまでのところ、私は思いつきました

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

しかし、私はそのパスが利用可能であることを期待することはできません。
ので、3つの質問:

  1. Gnomeの
  2. にデフォルトのサウンドを呼び出すためのより良い方法は、(少なくともDebain/Ubuntuのフレーバーの中で)かなり普遍そのパスであり
  3. paplayはにしばらく時間がかかりますサウンドを再生した後に終了する、それを呼び出すより良い方法はありますか?

私はむしろシステムスピーカーから鳴り響くのを避けたいと思います。これはひどく聞こえるでしょう(これはたくさん演奏されます)。そして、UbuntuのブラックリストはPCスピーカーに関係しています。
ありがとうございます!

答えて

3

paplay(それがあると仮定します)への移植可能な方法は、File::Whichを使用することがあります。次に、あなたのようなパスを得ることができます:

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

と非同期にサウンドを再生するには、することができますforkサブプロセス:

私は systemの多引数の型を使用していたことも
my $pid = fork; 
if (!$pid) { 
    # in the child process 
    system $paplay_path, '/usr/share/sounds/gnome/default/alert/sonar.ogg'; 
} 

# parent proc continues here 

お知らせ。そうすることで、シェルが回避され、要求されたプログラムが直接実行されます。

+0

私は 'fork'を考えていましたが、それが繰り返し呼び出されることにより多くの問題を引き起こすかどうかは分かりませんでした。私はそれを試してみましょう。ありがとう! – charlesbridge

+0

また、私は、再生可能であることを期待できるサウンドファイルへのパスを意味しました( 'paplay'自体ではなく)。しかし、私はそれが同じ考えだと思う、私はちょうど( - R $のパス)私は動作することを見つけるまで。 – charlesbridge

+0

また、私はPerl/Tkでこれを書いています。 'fork'は明示的に' CORE :: exit() 'や' POSIX :: _ exit() 'を呼び出さなければならないか、恐ろしいことが起こります。 – charlesbridge

関連する問題