2012-04-09 5 views
9

Я хочу генерировать звуковой сигнал с определенной частотой и длиной (для разных звуковых сигналов) с использованием системного звукового сигнала (и только динамики, если бипер недоступен/доступен). Я знаю, что это можно сделать с помощью ioctl, но для этого нужен root-доступ, которого я не хочу.Beep on Linux in C

Я знаю, что могу просто использовать команду «beep», но это была бы зависимость, которая, по возможности, не должна использоваться (никаких внешних зависимостей вообще, просто базовых библиотек linux и C).

То, что я в настоящее время является следующим кодом (но это требует привилегий суперпользователя для запуска):

#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]))); 
} 

Если нет другого способа сделать это, то я буду использовать звуковой сигнал, но я бы очень хотел чтобы избежать зависимостей и интегрировать звуковой сигнал непосредственно в мой скрипт, но я уверен, что кто-то здесь будет знать решение/обходное решение.

Мне не нужны внешние библиотеки, так как программа должна быть максимально легкой.

+0

Если вы работаете под рабочим столом, вы можете использовать ALSA. И вы также можете использовать команду 'play' ... И у некоторых настольных компьютеров есть уведомления ... –

+0

@BasileStarynkevitch Не было бы слишком сложным? Я просто хочу простой звуковой сигнал с определенной частотой и длиной. Как я уже сказал Пабло, я хочу сохранить его как можно более легким, но я полагаю, что использовать звуковой сигнал или suid для получения доступа к корням - это путь? – omnidan

+0

Посмотрите, поможет ли вам [это] (http://stackoverflow.com/questions/412789/windows-beep-equivalent-for-linux). @paxdiablo утверждает, что он может запускаться из учетной записи пользователя. –

ответ

3

Я думаю, что единственный способ сделать это - либо использовать suid для предоставления моего собственного доступа к корневой программе, либо использовать beep, у которого уже есть suid. Я полагаю, что я просто добавлю еще одну зависимость, так как beep не слишком велик.

Спасибо за все ответы, я уверен, что другие библиотеки отлично подходят для более сложных сигналов, но мне нужен очень простой!

Я думаю, что этот вопрос может быть помечен как разрешенный/закрытый.

Если кто-нибудь найдет способ, чтобы создать звуковой сигнал с помощью консоли без суперпользователя-привилегий, я по-прежнему заинтересован в этом решении :)

Спасибо всем еще раз.

0

Попробуйте использовать аудио-библиотеку, такую ​​как OpenAL.

+0

Я хочу, чтобы программа была как можно более легкой. – omnidan

+0

Затем просто вывод символ колокола '\ a' и оставить звук в эмуляторе терминала. Конечно, вы не можете изменить высоту тона и тон этого звука ... –

+0

@BasileStarynkevitch Да, конечно, это тоже возможно, но я хочу, чтобы определенные частоты немного отличались от сигналов. – omnidan

2

Самый основной сигнал по-прежнему «\ а», если ваш терминал поддерживает его:

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

Да, но это всего лишь одна частота. – omnidan

+0

Я сказал, что это было основополагающим ... Простите за это (реакция может по-прежнему использоваться для людей, которые посещают эту страницу впоследствии.) – wildplasser

+0

Также не очень хорошо работает, если выход перенаправляется. –

4

Пожалуйста, посмотрите на стандартный Linux beep исходного кода. http://www.johnath.com/beep/beep.c

Он использует KIOCSOUND ioctl для «звукового сигнала», но вам не нужны привилегии суперпользователя, чтобы заставить его играть. Я настроил его на чтение и выполнение пользователями в группе «beep».

Так что мой стандартный пользователь с UID 1000 находится в группе с GID 501 (я назвал его «beep»). Рядом с этим мне пришлось chmod 4750 /usr/bin/beep, и теперь я могу воспроизводить звуковые сигналы (в диапазоне 20-20000 Гц) без запроса привилегий суперпользователя.