9

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');

しかし、そのパスが利用可能であると期待できるかどうかはわかりません。
だから、3つの質問:

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

システムスピーカーのビープ音を鳴らしたくないのですが、それはひどく聞こえます(これはたくさん再生されるでしょう)、とにかくUbuntuはPCスピーカーをブラックリストに登録します。
ありがとう!

4

1 に答える 1

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;を使用したことにも注意してください。そうすることで、シェルを回避し、要求されたプログラムを直接実行します。これにより、危険なバグを回避できます (そしてより効率的です)。

于 2012-10-10T20:27:36.190 に答える