16

システムのビープ音を使用して、特定の周波数と長さ (さまざまな音声信号に対して) のビープ音を生成したいと考えています (ビープ音を使用できない/アクセスできない場合はスピーカーのみ)。ioctl を使用してこれを実行できることはわかっていますが、それには root アクセスが必要であり、これは望ましくありません。

「ビープ」コマンドを使用できることはわかっていますが、それは依存関係であり、可能であれば使用すべきではありません (外部依存関係はまったくなく、基本的な 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])));
}

これを行う方法が他にない場合は、ビープ音を使用しますが、依存関係を避けてビープ音をスクリプトに直接統合したいのですが、ここの誰かが解決策/回避策を知っていると確信しています.

プログラムはできるだけ軽量にする必要があるため、外部ライブラリは本当に必要ありません。

4

5 に答える 5

7

beep標準のLinuxソースコード をご覧ください。http://www.johnath.com/beep/beep.c

KIOCSOUND ioctlを使用して「ビープ音」を鳴らしますが、再生するためにスーパーユーザー権限は必要ありません。「ビープ」グループのユーザーが読み取りおよび実行できるように構成しました。

したがって、UID 1000の標準ユーザーは、GID 501のグループに属しています(私はそれを「ビープ音」と呼びました)。これの隣で私はしなければならなかった、chmod 4750 /usr/bin/beepそして今私はスーパーユーザー特権を要求することなくビープ音(20-20000Hzの範囲で)を鳴らすことができる。

于 2012-06-11T13:09:20.557 に答える
4

端末がサポートしている場合、最も基本的なビープ音は依然として '\a' です。

fprintf(stdout, "\aBeep!\n" );
于 2012-04-09T15:02:04.020 に答える
3

これを行う唯一の方法は、suid を使用して自分のプログラムに root アクセスを与えるか、beep既に suid を持っている を使用することだと思います。beepとにかく大きすぎないので、もう1つ依存関係を追加すると思います。

すべての回答に感謝します。他のライブラリはより複雑な信号に最適であると確信していますが、非常に単純なものが必要です!

この質問は、解決済み/クローズ済みとしてマークできると思います。

スーパーユーザー権限なしでコンソールを使用してビープ音を作成する方法を誰かが見つけた場合、私はまだこの解決策に興味があります:)

ありがとうございました。

于 2012-04-09T12:34:05.840 に答える
0

OpenALなどのオーディオ ライブラリを使用してみてください。

于 2012-04-09T12:05:42.887 に答える