RtAudio与QT

栏目: C++ · 发布时间: 5年前

内容简介:这几年一直在折腾一个网络+实时音频相关的项目,因为对实时性的要求太高了,所以一直在想各种办法去优化。最近优化到了音频播放的层面,了解到RtAudio这个实时音频库,决定用它来替代QT中对网络音频流的播放。毕竟是开源项目,打开官网,拿到例子,就开始往上怼呗。最初当然是要初始化一下,所以直接 COPY 代码就上我了个乖乖,之前QT GUI项目啥也没配置,就 include 一下头文件,居然编译成功。好事啊!

这几年一直在折腾一个网络+实时音频相关的项目,因为对实时性的要求太高了,所以一直在想各种办法去优化。最近优化到了音频播放的层面,了解到RtAudio这个实时音频库,决定用它来替代QT中对网络音频流的播放。

毕竟是开源项目,打开官网,拿到例子,就开始往上怼呗。最初当然是要初始化一下,所以直接 COPY 代码就上

RtAudio adc;
  if ( adc.getDeviceCount() < 1 ) {
    std::cout << "\nNo audio devices found!\n";
    exit( 1 );
  }

我了个乖乖,之前QT GUI项目啥也没配置,就 include 一下头文件,居然编译成功。好事啊!

一运行,程序一个照面都没打,就退出了,但是应用程序输出框里什么都没有,也不知道怎么回事。

分析与解决

于是,决定先编译运行一下 RtAudio 自己的例子。先建立一个 QT 控制台程序,然后把 RtAudio 里的 test/playsaw.cpp 内容拷到主文件,编译,运行,还是马上退出了。不过,幸运的是,命令行留下了两行字:

RtApiDummy: This class provides no functionality.


No audio devices found!

至此,我才想起来,原来在 QT 的 GUI 应用中,std::out 的内容并不会出现在 QT Creator 调试界面的“应用程序输出”窗口中。果然,把 std::out 改为 qDebug()  之后,就可以看到错误提示了。

那么,上面的 RtApiDummy 又是什么鬼呢?查找文档之后,才明白这是因为没有指定 Api,于是修改代码:

int main()
{
  RtAudio dac(RtAudio::Api::WINDOWS_DS);
//    RtAudio dac;

很简单,就是用给 RtAudio 类的实例构造函数一个对应用的Api,WINDOWS_DS 的意思是指使用 DIRECT SOUND 作为语音接口。其他可选的还的 WINDOWS_ASIO 和 WINDOWS_WASAPI,在此略过不述。

然后再编译,就会出现堆 ERROR 了,

RtAudio.obj:-1: error: LNK2019: unresolved external symbol __imp__GetDesktopWindow@0 referenced in function "private: virtual bool __thiscall RtApiDs::probeDeviceOpen(unsigned int,enum RtApi::StreamMode,unsigned int,unsigned int,unsigned int,unsigned long,unsigned int *,struct RtAudio::StreamOptions *)" (?probeDeviceOpen@RtApiDs@@EAE_NIW4StreamMode@RtApi@@IIIKPAIPAUStreamOptions@RtAudio@@@Z)
RtAudio.obj:-1: error: LNK2019: unresolved external symbol __imp__CoUninitialize@0 referenced in function "public: virtual __thiscall RtApiDs::~RtApiDs(void)" (??1RtApiDs@@UAE@XZ)
RtAudio.obj:-1: error: LNK2019: unresolved external symbol __imp__CoInitialize@4 referenced in function "public: __thiscall RtApiDs::RtApiDs(void)" (??0RtApiDs@@QAE@XZ)
RtAudio.obj:-1: error: LNK2019: unresolved external symbol _DirectSoundCreate@12 referenced in function "public: virtual struct RtAudio::DeviceInfo __thiscall RtApiDs::getDeviceInfo(unsigned int)" (?getDeviceInfo@RtApiDs@@UAE?AUDeviceInfo@RtAudio@@I@Z)
RtAudio.obj:-1: error: LNK2019: unresolved external symbol _DirectSoundEnumerateW@8 referenced in function "public: virtual unsigned int __thiscall RtApiDs::getDeviceCount(void)" (?getDeviceCount@RtApiDs@@UAEIXZ)
RtAudio.obj:-1: error: LNK2019: unresolved external symbol _DirectSoundCaptureCreate@12 referenced in function "public: virtual struct RtAudio::DeviceInfo __thiscall RtApiDs::getDeviceInfo(unsigned int)" (?getDeviceInfo@RtApiDs@@UAE?AUDeviceInfo@RtAudio@@I@Z)
RtAudio.obj:-1: error: LNK2019: unresolved external symbol _DirectSoundCaptureEnumerateW@8 referenced in function "public: virtual unsigned int __thiscall RtApiDs::getDeviceCount(void)" (?getDeviceCount@RtApiDs@@UAEIXZ)

还好,这个我有点老经验,GetDesktopWindow、CoUninitialize、CoInitialize、DirectSoundCreate这几个API很熟悉啊,error: LNK2019: unresolved external symbol 那肯定是一些库没有链接上去啊。通过慢慢 Google 各个函数分别属于哪个 lib,然后给项目的 .pro 文件加上这么一行:

LIBS += -ldsound -luser32 -lole32

把dsound.lib user32.lib ole32.lib 链接进去,就顺利编译通过了。运行,可以听到音箱发出声音,控制台也会输出:

Playing ... press <enter> to quit.

至此,问题就解决了。

尾声

最后,把修改 RaAudio 实例构造和增加 lib 链接的这两个修改应用到之前的 GUI 程序中,也顺利解决问题。

附,版本号:

VC2013

RtAudio 5.0

QT 5.6


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

代码2.0

代码2.0

(美)劳伦斯·莱斯格 / 李旭、沈伟伟 / 清华大学出版社 / 2009-7-1 / 48.00

《代码2.0:网络空间中的法律》在西方发达国家已成为法律学、公共管理学、商学、传播学、政治学和信息科学技术专业的必读书目。对于政府管理者、法律执业者、ICT企业管理者、创意产业从业者和广大信息工程技术人员来说,这的确是一本能够启迪思维的难得之作。在众多以网络为主题的书籍中,这是一本问世近10年但居然没有过时的书!于是,它成为了经典之作,荣膺学术名著和畅销读物两项桂冠。一起来看看 《代码2.0》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具