我想用语音数据增加缓冲区的音量.关键是我正在使用DirectSound,我有一个主缓冲区和一个辅助缓冲区 - 所有流混合都是手工完成的.在语音聊天中,所有参与者可以具有独立的音量级别.我将每个流数据乘以一个值(增益)并将其加到一个缓冲区.一切正常,但当我尝试将数据乘以大于1.0f的值时 - 我听到一些剪辑或什么.
我尝试过使用Audacity效果压缩器,但这无助于减少奇怪的噪音.
可能我应该以其他方式改变收益?或者只是使用另一种后处理算法?
更新:哇,我刚发现有趣的事情!在增加音量之前,我已经放弃了音频.
这是照片

对不起质量 - 我认为这应该是声音出现的方式(我自己画了红线).真的看起来像超过样本数据类型的值.但我无法理解为什么?我的samplebuffer是BYTE,但我只通过短指针访问它.它已签名但即使*ptr约为15-20万时也会发生剪辑.
我想开发一个虚拟麦克风驱动程序。请不要谈论任何有关 DirectShow 的内容 - 这不是“方法”。我需要一个适用于任何软件(包括 Skype 和 MSN)的解决方案。而DirectShow并不符合这些要求。
我在 Windows 7 WDK 中找到了AVStream Filter-Centric Simulated Capture Driver (avssamp.sys)。我需要的是它的音频部分。默认情况下,它读取 avssamp.wav 并播放它。但该驱动程序被注册为WDM流捕获设备。我想要它在音频捕获设备中。
网上有一些帖子,但都是一样的:
http://www.winvistatips.com/problem-installing-avssamp-audio-capture-sources-category-t184898.html
我认为将此过滤器驱动程序注册为音频捕获设备将使 Skype 将其识别为麦克风,因此我将能够推送任何 PCM 文件,就像它来自麦克风一样。
如果有人之前已经遇到过这个问题,请提供帮助。
提前致谢。
我正在开发一个虚拟驱动程序,QA需要在几台Windows 7机器上查看x64版本.我严格按照生成证书的说明进行测试,但我仍然遇到一些问题.所以,我已经完成了以下步骤:
Makecert -r -pe -n "CN=TestCertForWDK" -ss "TestCert" mccert.cer
Run Code Online (Sandbox Code Playgroud)
我在安装程序中添加了以下两行,以便在远程计算机上安装自动证书
certmgr.exe -add mccert.cer -s -r localMachine root
certmgr.exe -add mccert.cer -s -r localMachine trustedpublisher
Run Code Online (Sandbox Code Playgroud)
Inf2cat.exe /driver:D:\Projects\MyDrv\package\ /os:7_X64
Run Code Online (Sandbox Code Playgroud)
最后
signtool sign /a /v /s "TestCert" /n "TestCertForWDK" mydrv.cat
signtool sign /a /v /s "TestCert" /n "TestCertForWDK" mydrv.sys
Run Code Online (Sandbox Code Playgroud)
顺便说一句,起初我尝试通过devcon安装.它报告"devcon成功",但设备管理器中的设备标有黄色感叹号(不受信任的签名).
后来,我尝试使用hdwwiz - 当我手动输入驱动程序的路径(有磁盘)时 - hdwwiz显示驱动程序有签名,安装过程没有任何警告.但在那之后,正如我已经提到的那样,由于签名无效,设备无法正常工作(黄色"!")
我在Winqual上有一个帐户,但是驱动程序仍处于开发状态,我还不想为提交付款.难道我做错了什么?是否可以使用我自己makecert.exe生成的证书安装x64驱动程序,而无需在最终用户PC上禁用驱动程序签名(这对我来说是不可接受的)?
这是创建COM对象的代码示例:
CComPtr<IBaseFilter> pFilter;
auto hr = CoCreateInstance(CLSID_DMOWrapperFilter, NULL,
CLSCTX_INPROC_SERVER, IID_IBaseFilter, reinterpret_cast<void**>(&pFilter));
Run Code Online (Sandbox Code Playgroud)
我已经看到某个地方检查是否CoCreateInstance()成功应该如下所示:
if (SUCCEEDED(hr) && pFilter != nullptr)
{
// code goes here
}
Run Code Online (Sandbox Code Playgroud)
如果我只检查hr怎么办?这不够吗?我也应该检查一下filter != nullptr吗?
//would this be enough?
if (SUCCEEDED(hr))
{
// code goes here
}
Run Code Online (Sandbox Code Playgroud)
这个问题还涉及其他COM方法QueryInterface().