2012-04-09 28 views
9

Tôi muốn tạo âm thanh tiếng bíp với tần số và độ dài cụ thể (cho các tín hiệu âm thanh khác nhau) bằng cách sử dụng tiếng bíp hệ thống (và chỉ loa nếu không có tiếng bíp). Tôi biết nó có thể làm điều này bằng cách sử dụng ioctl, nhưng điều đó đòi hỏi quyền truy cập root, mà tôi không muốn.Bíp trên Linux trong C

Tôi biết tôi chỉ có thể sử dụng lệnh "bíp", nhưng đó sẽ là phụ thuộc, nếu có thể, không được sử dụng (không phụ thuộc vào bên ngoài, chỉ các thư viện linux cơ bản và C).

Những gì tôi đang có là đoạn mã sau (nhưng điều này đòi hỏi đặc quyền superuser để chạy):

#include <stdlib.h> 
#include <fcntl.h> 
#include <linux/kd.h> 

int main(int argc, char *argv[]) 
{ 
int fd = open("/dev/console", O_RDONLY); 
if (fd == -1 || argc != 3) return -1; 
return ioctl(fd, KDMKTONE, (atoi(argv[2])<<16)+(1193180/atoi(argv[1]))); 
} 

Nếu không có cách nào khác để làm điều này, sau đó tôi sẽ sử dụng tiếng bíp, nhưng tôi thực sự muốn để tránh sự phụ thuộc và tích hợp tiếng bíp trực tiếp vào kịch bản của tôi, nhưng tôi chắc rằng ai đó ở đây sẽ biết giải pháp/giải pháp thay thế.

Tôi không thực sự muốn thư viện bên ngoài vì chương trình phải nhẹ nhất có thể.

+0

Nếu chạy dưới máy tính để bàn, bạn có thể sử dụng ALSA. Và bạn cũng có thể sử dụng lệnh 'play' ... Và một số máy tính để bàn có thông báo ... –

+0

@BasileStarynkevitch Chẳng phải đó là những thứ quá phức tạp sao? Tôi chỉ muốn một tiếng bíp đơn giản với tần số và độ dài cụ thể. Như tôi đã nói với Pablo, tôi muốn giữ nó nhẹ nhất có thể, nhưng tôi cho rằng sử dụng tiếng bíp hoặc suid để có quyền truy cập root là cách để đi, sau đó? – omnidan

+0

Xem nếu [this] (http://stackoverflow.com/questions/412789/windows-beep-equivalent-for-linux) giúp bạn. @paxdiablo tuyên bố nó có thể chạy từ một tài khoản người dùng quá. –

Trả lời

3

Tôi nghĩ cách duy nhất để thực hiện việc này là sử dụng suid để cấp quyền truy cập gốc chương trình của riêng tôi hoặc sử dụng beep, đã hết hạn. Tôi cho rằng tôi sẽ chỉ thêm một phụ thuộc nữa, sau đó, vì beep cũng không quá lớn.

Cảm ơn tất cả các câu trả lời, tôi chắc rằng các thư viện khác là tuyệt vời cho các tín hiệu phức tạp hơn, nhưng tôi cần một số rất đơn giản!

Tôi nghĩ câu hỏi này có thể được đánh dấu là đã giải/đóng, sau đó.

Nếu ai tìm thấy một cách để tạo ra một tiếng bíp bằng cách sử dụng giao diện điều khiển mà không superuser-đặc quyền, tôi vẫn quan tâm đến giải pháp này :)

Cảm ơn tất cả các bạn một lần nữa.

0

Thử sử dụng thư viện âm thanh như OpenAL.

+0

Tôi muốn giữ cho chương trình càng nhẹ càng tốt – omnidan

+0

Sau đó, chỉ cần xuất một nhân vật chuông '\ a' và để lại âm thanh làm cho trình giả lập thiết bị đầu cuối. Tất nhiên, bạn không thể thay đổi cường độ và giai điệu của âm thanh đó ... –

+0

@BasileStarynkevitch Vâng, tất nhiên điều đó cũng có thể xảy ra, nhưng tôi muốn tần số cụ thể khác với tín hiệu một chút. – omnidan

2

Các tiếng bíp cơ bản nhất vẫn là '\ a', nếu thiết bị đầu cuối của bạn hỗ trợ nó:

fprintf(stdout, "\aBeep!\n"); 
+0

Vâng, nhưng đó chỉ là một tần số. – omnidan

+0

Tôi đã nói nó là cơ bản ... Xin lỗi về điều đó. (Phản ứng vẫn có thể sử dụng được cho những người truy cập trang này sau đó.) – wildplasser

+0

Cũng không hoạt động tốt nếu đầu ra được chuyển hướng. –

4

Hãy nhìn vào mã nguồn chuẩn linux beep. http://www.johnath.com/beep/beep.c

Nó sử dụng KIOCSOUND ioctl để "bíp", nhưng bạn không cần đặc quyền superuser để phát. Tôi đã định cấu hình để người dùng có thể đọc và thực thi trên nhóm "bíp".

Vì vậy, người dùng chuẩn của tôi với UID 1000 nằm trong nhóm có GID 501 (tôi gọi nó là "bíp"). Bên cạnh điều này tôi đã phải chmod 4750 /usr/bin/beep và bây giờ tôi có thể chơi tiếng bíp (trong phạm vi 20-20000Hz) mà không yêu cầu đặc quyền superuser.