【问题标题】:Is there a way to play a system beep on Mac OS?有没有办法在 Mac OS 上播放系统提示音?
【发布时间】:2011-11-16 13:13:31
【问题描述】:

有没有办法使用 C++ 和 Xcode 在 Mac OS 上播放系统提示音?我知道我需要使用图书馆。是否有适用于 Mac 和 Windows 平台的库?

【问题讨论】:

  • std::cout << "\007"; 不起作用吗?
  • 打印 ascii 值 07 有效吗?
  • 我认为 ASCII 7 (BEL) 仅适用于命令行工具。
  • 不... Mac OS 应该是用户友好的。此外,压电蜂鸣器太贵了。
  • toot 是一个跨平台的 C C++ 文件和命令行工具,它尝试调用多个声音发生器来产生哔声

标签: c++ audio beep


【解决方案1】:

我想你可能想使用NSBeep


NSBeep

播放系统提示音。

#include <AppKit/AppKit.h>

void NSBeep (void);

这对于命令行工具似乎可以正常工作:

#include <AppKit/AppKit.h>
#include <iostream>

using namespace std;

int main(void)
{
    cout << "Hello world !" << endl;
    NSBeep();
    sleep(1)
    return 0;
}

$ g++ -Wall -framework AppKit beep.cpp -o beep
$ ./beep

2021 年 5 月更新

虽然此解决方案在 2011 年有效,但 AppKit 现在似乎不再与 C++ 兼容,因此您现在需要将该文件视为 Objective-C++,即将 beep.cpp 重命名为 beep.mm。

【讨论】:

  • 使用 C++ 而不是 Foundation。
  • 你的意思是你只是在写一个命令行工具而不是一个合适的 Mac OS X 应用程序?你仍然可以使用 NSBeep() - 见上面的例子。
  • 这不会编译
  • @김선달:你说得对 - 10 年前我写这个答案时它确实有效,但显然同时出现了问题。看起来您不能再将 AppKit 框架与 C++ 一起使用。
  • @김선달:我发现你仍然可以按原样编译上面的代码,但是对于当前版本的 macOS 和 Xcode,源文件需要被视为 Objective-C++ 而不是 C++(更改 .cpp扩展名为 .mm)。
【解决方案2】:

这是 2021 年适用于当前 macOS (Big Sur) 的另一种方法(与我之前的 NSBeep 解决方案不同,它现在仅适用于 Objective-C++,不适用于 vanilla C++)。我反汇编了NSBeep,发现它只是调用了AudioServicesPlayAlertSound,参数值为0x1000(kSystemSoundID_UserPreferredAlert)。 AudioServicesPlayAlertSound 是 AudioToolbpx 框架的一部分,幸运的是它仍然适用于 C++(与 AppKit 不同)。

#include <AudioToolbox/AudioServices.h>
#include <iostream>

using namespace std;

int main(void)
{
    cout << "Hello world !" << endl;
    AudioServicesPlayAlertSound(kSystemSoundID_UserPreferredAlert);
    sleep(1);
    return 0;
}

编译运行:

$ g++ -Wall -framework AudioToolbox beep.cpp -o beep
$ ./beep

【讨论】:

    【解决方案3】:

    播放哔声的跨平台方式是std::cout &lt;&lt; "\007";。我一直试图通过传入一个字符然后递减直到 7 来播放它。那没有用。不过,显式输出代码确实有效。

    【讨论】:

      猜你喜欢
      • 2019-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-03
      • 1970-01-01
      • 2022-12-11
      • 1970-01-01
      相关资源
      最近更新 更多