使用 IOCTL 将音频数据从用户模式发送到 Sysvad(虚拟音频驱动程序)
Posted
技术标签:
【中文标题】使用 IOCTL 将音频数据从用户模式发送到 Sysvad(虚拟音频驱动程序)【英文标题】:Send audio data from usermode to Sysvad (virtual audio driver) use IOCTL 【发布时间】:2020-11-01 07:25:08 【问题描述】:在我的应用程序(用户模式)中,我接收音频数据并将其保存使用功能:
VOID CSoundRecDlg::ProcessHeader(WAVEHDR * pHdr)
MMRESULT mRes=0;
TRACE("%d",pHdr->dwUser);
if(WHDR_DONE==(WHDR_DONE &pHdr->dwFlags))
mmioWrite(m_hOPFile,pHdr->lpData,pHdr->dwBytesRecorded);
mRes=waveInAddBuffer(m_hWaveIn,pHdr,sizeof(WAVEHDR));
if(mRes!=0)
StoreError(mRes,TRUE,"File: %s ,Line Number:%d",__FILE__,__LINE__);
pHdr 指向音频数据的指针(byte[11025]) 如何使用 IOCTL 在 sysvad 中获取这些数据。感谢您的帮助。
【问题讨论】:
为什么选择 IOCTL?您应该能够使用标准音频 API 与此/任何音频驱动程序对话,即:docs.microsoft.com/en-us/windows/win32/coreaudio/… @SimonMourier 感谢您的评论。对不起,我的英语不好。我对此一无所知,并试图学习,我遵循了我发现的内容。这是一个guide,几乎就像我打算做的那样。这是我从麦克风到 Skype 和 sysvad 作为中介的音频。 【参考方案1】:如果我理解正确,您有一个音频缓冲区,而不是您想在 sysvad 中发送输出。对于这种情况,您必须使用“writebytes”编写黄油 请查看此示例以获取更多详细信息。
https://github.com/microsoft/Windows-driver-samples/blob/master/audio/sysvad/EndpointsCommon/minwavertstream.cpp
更新
回复您的评论:
循环缓冲区不是必须的,它真的取决于你想要做的实现,重点是在内存中获取缓冲区,写它就像这样
adapterObject->WriteEtwEvent(eMINIPORT_LAST_BUFFER_RENDERED,
m_ullLinearPosition + ByteDisplacement, // Current linear buffer position
m_ulCurrentWritePosition, // The very last WaveRtBufferWritePosition that the driver received
0,
0);
理想情况下,您将使用关注点分离和相互独立的读写逻辑,缓冲区对象只是在它们之间传递
【讨论】:
我知道我必须使用单独的循环缓冲区来执行此操作,但我不知道在哪里声明它或如何创建它。刚找到一个教程[community.osr.com/discussion/292250/…但是看不懂 你能告诉我一些完成这项工作的示例项目吗(将音频数据从用户模式发送到 sysvad)。我仍然不明白这一点以及如何实现它。谢谢你的回答。 你好柠檬酷!我找到了一块code 存储数据,但我想知道它是否是一个循环缓冲区。你能向我解释一下 PNOISE_DATA_STRUCTURE 吗?也许this 是他们提取数据的方式。你能解释一下m_pExtensionData 是什么吗?请帮我。谢谢你。以上是关于使用 IOCTL 将音频数据从用户模式发送到 Sysvad(虚拟音频驱动程序)的主要内容,如果未能解决你的问题,请参考以下文章