【问题标题】:ioctl error when trying to beep with a duration and frequency尝试以持续时间和频率发出哔声时出现 ioctl 错误
【发布时间】:2014-01-12 12:10:44
【问题描述】:

我正在尝试发出具有频率和持续时间的哔声,我正在使用 ioctl 和带有控制台路径的文件(我认为这是正确的,顺便说一下,我使用的是 debian 6)但是我不知道为什么它不起作用。代码到达 ioctl 行,但没有发出哔哔声。我在虚拟机中工作。驱动程序应该不是问题,因为我已经安装了自己的驱动程序来控制键盘 LED 并且没有问题。

(我已经按照这个例子:http://linuxplayer.org/2010/04/beep-your-pc-speaker-in-linux

#include <sys/ioctl.h>
#include <linux/kd.h>

int bip;
#define consolepath "/dev/console"
//#define consolepath "/dev/tty0"

void beep (int freq, int dur){
    int aux;
    if ( (bip = open(consolepath, 'w')) == -1 ) {
        printf ("console unreachable/dev/console!\n" );
    }else{
        //fprintf(bip, "%c[10;%d]%c[11;%d]\a", ESC, freq, ESC, dur);    //Another different try
        ioctl(bip, KDMKTONE, (dur<<16 | 1193180/freq));

        close(bip);

    }
}

【问题讨论】:

  • 检查失败的 ioctl 调用中的 errno 值。
  • ioctl 调用,返回 0,所以看起来它会做得很好
  • 打开扬声器并将音量调到零以上:)
  • 我的扬声器已打开,但谢谢 :) 是否有其他途径可以让我发出具有频率和持续时间的声音?
  • 频率是否在可听范围内? 10 到 10-20kHx?

标签: c linux console beep


【解决方案1】:

我不知道这是否能解决您的问题,但给出的“oflag”参数 到open() 应该是O_WRONLY 或者O_RDWR,但不是字符'w'

【讨论】:

  • 是的,我知道,我已经更改了它,但正如预期的那样,它仍然不起作用。
【解决方案2】:

问题出在我的操作系统上,我在VMWare Workstation中执行Debian 6,端口映射没有做好,所以我做不到。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-17
    • 1970-01-01
    • 2015-11-18
    • 1970-01-01
    • 1970-01-01
    • 2021-09-25
    • 1970-01-01
    相关资源
    最近更新 更多