2012-10-10 40 views
6

Tôi đang cố gắng thêm âm thanh vào tập lệnh Perl để cảnh báo cho người dùng rằng giao dịch đã ổn (người dùng có thể không nhìn vào màn hình mọi lúc trong khi làm việc). Tôi muốn ở mức di động nhất có thể, vì tập lệnh chạy trên các trạm Windows và Linux.
Tôi có thểPhát Âm thanh trong kịch bản Perl

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

cho Windows. Nhưng tôi không chắc chắn làm thế nào để gọi một âm thanh chung trên Linux (Gnome). Cho đến nay, tôi đã đi lên với

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

Nhưng tôi không chắc chắn nếu tôi có thể tin tưởng vào con đường mà là có sẵn.
Vì vậy, ba câu hỏi:

  1. Có cách nào tốt hơn để gọi một âm thanh mặc định trong Gnome
  2. Đó có phải là con đường khá phổ biến (ít nhất là trong hương vị Debain/Ubuntu)
  3. paplay mất một thời gian để thoát ra sau khi chơi một âm thanh, có cách nào tốt hơn để gọi nó?

Tôi muốn tránh xa tiếng bíp loa hệ thống, nghe có vẻ khủng khiếp (điều này sẽ được phát nhiều) và Ubuntu sẽ liệt kê đen Loa PC.
Cảm ơn!

Trả lời

3

Cách di chuyển dễ dàng hơn để có đường dẫn đến paplay (giả sử là có) có thể sử dụng File::Which. Sau đó, bạn có thể nhận được con đường như:

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

Và để phát âm thanh không đồng bộ, bạn có thể fork một tiến trình con:

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

# parent proc continues here 

Cũng thông báo rằng tôi đã sử dụng các hình thức đa đối số của system; làm như vậy tránh vỏ và chạy chương trình được yêu cầu trực tiếp. Điều này tránh các lỗi nguy hiểm (và hiệu quả hơn.)

+0

Tôi đã nghĩ đến 'ngã ba', nhưng tôi không chắc liệu điều đó có gây ra nhiều vấn đề hơn khi được gọi nhiều lần hay không. Tôi sẽ thử. Cảm ơn! – charlesbridge

+0

Ngoài ra, tôi có nghĩa là đường dẫn đến một tập tin âm thanh mà tôi có thể đếm trên có sẵn để chơi (không phải 'paplay' chính nó). Nhưng tôi nghĩ rằng đó là cùng một ý tưởng, tôi sẽ chỉ (-R $ đường dẫn) cho đến khi tôi tìm thấy một trong đó hoạt động. – charlesbridge

+0

Ngoài ra, tôi đang viết điều này trong Perl/Tk. 'fork' phải gọi rõ ràng' CORE :: exit() 'hoặc' POSIX :: _ exit() 'hoặc những điều kinh khủng xảy ra. – charlesbridge