Vista下DirectSoundCapture8创建DirectSoundCaptureBuffer8有问题

gamedragon 2008-05-05 10:52:28
下面这段代码是创建DirectSoundCaptureBuffer8用来录音的。
if(!m_strRecDev.empty()) {
IMMDevice *dev;
HRESULT hr;
if(!_get_device(m_strRecDev, WAVEIN, &dev))
return ERR_AUDIO_NODEVICE;
hr = dev->Activate(IID_IDirectSoundCapture8, CLSCTX_ALL, NULL, (void **)&m_dsc);
dev->Release();
if(FAILED(hr))
return ERR_AUDIO_OPEN;
}
else {
GUID guid = DSDEVID_DefaultCapture;
if(FAILED(DirectSoundCaptureCreate8(&guid, &m_dsc, NULL)))
return ERR_AUDIO_OPEN;
}

IDirectSoundCaptureBuffer *dscb;
DSCBUFFERDESC dscbd = {0};
WAVEFORMATEX wfx;
dscbd.dwSize = sizeof(DSCBUFFERDESC);
dscbd.dwBufferBytes = m_RecBlock * 2;
dscbd.lpwfxFormat = &wfx;
_fill_waveformat(&wfx, m_RecChannel, m_RecSampleRate, m_RecSampleBits);
if(FAILED(m_dsc->CreateCaptureBuffer(&dscbd, &dscb, NULL)))
return ERR_AUDIO_OPEN;

// error occurs here
HRESULT hr = dscb->QueryInterface(IID_IDirectSoundCaptureBuffer8, (void **)&m_dscb);
dscb->Release();
if(FAILED(hr)) // hr = NOINTERFACE if error occurs
return ERR_AUDIO_OPEN;

用IMMDevice::Activate这个方法创建出DirectSoundCapture8对象,当使用这个对象创建DirectSoundCaptureBuffer8时出错。
如果用DirectSoundCaptureCreate8函数创建出的DirectSoundCapture8对象就没有这个错误。

IMMDevice::Activate和DirectSoundCaptureCreate8这两种方法有什么不同呢?
...全文
231 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
gamedragon 2008-05-11
  • 打赏
  • 举报
回复
难道除了用MMDevice::Active无法创建DirectSoundCapture8对象?
gamedragon 2008-05-06
  • 打赏
  • 举报
回复
确实Vista中的DirectX版本是10,但是看上面的代码,用IMMDevice::Active方法创建出来的IDirectSoundCapture8对象和用DirectSoundCaptureCreate8创建出来的IDirectSoundCapture8对象行为不同。
要怎么做才能让这两种方法创建出来的对象行为一致?我想问的就是这个问题。

我1楼写的东西只是我的一些推测。
CathySun118 2008-05-06
  • 打赏
  • 举报
回复
不清楚你的问题。vista支持DirectX9和DirectX10
gamedragon 2008-05-05
  • 打赏
  • 举报
回复
在dsound.h中,
#define IID_IDirectSoundCapture8 IID_IDirectSoundCapture
就是说这两个ID是一样的,难道说dev->Activate(IID_IDirectSoundCapture8, CLSCTX_ALL, NULL, (void **)&m_dsc)这个调用创建出了一个DirectSoundCapture对象而不是DirectSoundCapture8对象?
用DirectSoundCapture对象创建出来的buffer应该是无法Query出DirectSoundCaptureBuffer8对象来,但那也是针对老版本的DirectSound,难道Vista中的Dsound是Dsound8以前的?
怎么能看出Vista支持的DirectX版本呢?
它通过读取 Excel 表格中的业务数据,结合 Word 模板,自动生成多个独立的合同文件,并自动处理了表格中“合计”行的合并与中文大写金额转换。 资源名称:合同文档自动化生成脚本 (1.py) 名字真是乱起 核心功能:Excel 数据读取 → Word 模板渲染 → 表格单元格合并与金额处理 → 批量导出 Word 文档。 适用场景:财务、销售或行政部门需要根据订单或业务明细,批量制作格式统一的合同、报价单或结算单。 1. 自动把“钱”变成“大写” 它干了啥:它内置了一个翻译功能,专门把阿拉伯数字(比如 100.50)自动转换成财务专用的中文大写(比如 壹佰元伍角)。 为什么有用:写合同最怕手滑写错金额,或者大写格式不对。这个功能全自动搞定,既标准又不会出错。 2. 自动“装修”表格底部 它干了啥:生成文档后,它会自动找到表格的最后一行,把前几列合并成一个大格子,写上“合计:XXX(大写金额)”,并在最右边填上具体的数字总额。 为什么有用:平时我们做完表格,还得手动去合并单元格、算总数、填大写,非常繁琐。这个脚本直接一步到位,把表格收尾工作做得漂漂亮亮。 3. 像“发传单”一样批量做合同 它干了啥:它会看你的 Excel 表格,按照“编号”把数据归类。 如果是同一个编号的货物,它会把它们塞进同一个合同里(比如一个客户买了三样东西,会自动列三行)。 如果是不同的编号,它就生成不同的合同文件。 为什么有用:不管你有一百个还是一千个订单,它都能自动拆分,给每个客户生成一份独立的、内容准确的合同,完全不用人工去复制粘贴。

3,248

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧