Звуковой сигнал на Linux в C

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

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

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

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

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

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

4 ответов


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

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

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


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

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

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

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

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


самый простой звуковой сигнал по-прежнему "\a", если ваш терминал поддерживает его:

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

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