【问题标题】:Windows Beep() equivalent for Linux适用于 Linux 的 Windows Beep() 等效项
【发布时间】:2010-09-29 14:13:52
【问题描述】:

我正在 Windows 上尝试 Beep 功能:

#include <windows.h>
...
Beep(frequency, duration);

然后计算机会在一段时间内以某种频率发出哔哔声。我将如何在 Linux 计算机上执行此操作?

编辑:输出不同的频率很重要。

【问题讨论】:

    标签: c linux audio


    【解决方案1】:

    查看 Ubuntu(可能还有其他发行版)提供的 beep 源代码,或者查看 http://www.johnath.com/beep/beep.c 以获取其他源代码(我相信它是相同的代码)。

    它可以让您轻松控制频率、长度和重复次数(除其他外)。

    【讨论】:

    • 我相信您需要 root 权限来调整 PC-Speaker 的蜂鸣声细节,至少在 X 下是这样。
    • 不使用此代码,我直接从用户帐户使用它。我认为该控件是由标准设备驱动程序 ioctl() 接口公开的。
    【解决方案2】:

    让我们有一些来自音频扬声器的 gabba

    #!/usr/bin/ruby
    
    $audio = File.open("/dev/audio", "w+")
    def snd char
        $audio.print char.chr
    end
    
    def evil z
        0.step(100, 4.0 / z) { |i|
            (i / z).to_i.times { snd 0 }
            (i / z).to_i.times { snd 255 }
        }
    end
    
    loop {
        evil 1 
        evil 1
        evil 1
        evil 4
    }
    

    更严重的是:

    //g++ -o pa pa.cpp -lportaudio
    #include <portaudio.h>
    #include <cmath>
    
    int callback(void*, void* outputBuffer, unsigned long framesPerBuffer, PaTimestamp, void*) {
        float *out = (float*)outputBuffer;
        static float phase;
        for(int i = 0; i < framesPerBuffer; ++i) {
            out[i] = std::sin(phase);
            phase += 0.1f;
        }
        return 0;
    }
    
    int main() {
        Pa_Initialize();
        PaStream* stream;
        Pa_OpenDefaultStream(&stream, 0, 1, paFloat32, 44100, 256, 1, callback, NULL);
        Pa_StartStream(stream);
        Pa_Sleep(4000);
    }
    

    【讨论】:

    • 您应该将相位初始化为 0.0,如果它大于 2pi,则可能会将其倒回,即。 if (phase > 2 * M_PI) phase -= 2 * M_PI, else you will come to the point, where phase + 0.1f == phase.我还没有计算出什么时候会发生这种情况:)
    • 好点。或者相位可以是整数,我会选择 sin(phase/10.0)
    【解决方案3】:

    我不熟悉 Linux,但输出 ascii 字符 0x07 似乎可以解决我通过快速谷歌搜索阅读的内容。

    【讨论】:

    • 这对 OP 没有帮助。 OP 指定他需要不同的频率。
    【解决方案4】:

    我建议您查看beep 实用程序的源代码。这正是你想要的。 (具体来说,它会打开“/dev/console”并使用 ioctl 请求哔声。请注意,这仅适用于附加的控制台)

    【讨论】:

      【解决方案5】:

      总结:

      1. 将 BEL 字符输出到终端可能会发出哔声 - 取决于终端的类型和配置。然而,这无法控制。

      2. 您喜欢的任何声音都可以通过将音频数据输出到 /dev/dsp 或其他声音设备来产生。这包括哔声,但发出声音涉及播放实际样本。

      3. 控制台驱动程序(在某些配置中)为 /dev/console 提供了一个 ioctl,它以可配置的音高发出哔哔声(很像 NT 那个)

      【讨论】:

        【解决方案6】:

        this site 显示两种方式:

        char beep[] = {7, ”};
        printf(“%c”, beep);
        

        Beep(587,500);
        

        【讨论】:

        • 不起作用。 unicode 引号立即停止编译并出现错误,我什至不知道您要对 {7,"} 做什么(这也会产生相同的错误)
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多