c++ - 使用IOCTL将音频数据从用户模式发送到Sysvad(虚拟音频驱动程序)

标签 c++ winapi audio ioctl

在我的应用程序(用户模式)中,我接收音频数据并使用以下功能将其保存:

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指针指向音频数据(字节[11025])
如何使用IOCTL在sysvad中获取此数据。感谢帮助。

最佳答案

如果我理解正确,则您有一个音频缓冲区,而不是要发送给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);
理想情况下,您应该使用关注点分离以及彼此独立的读写逻辑,并且缓冲区对象只是在它们之间传递

关于c++ - 使用IOCTL将音频数据从用户模式发送到Sysvad(虚拟音频驱动程序),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64629571/

相关文章:

c++ - 指向模板类方法的函数指针

c - 制作跨所有用户的单例应用程序

c++ - 为什么我的 TB_INSERTBUTTON 消息导致 comctl32 抛出?

java - 两种语言的TextToSpeech-Android

audio - 将 5.1 视频缩混为立体声的更快方法?

javascript - 如何检查音频是否未加载?

c++ - 访问模板类的 protected 属性

c++ - std::priority_queue 比较和队列元素的年龄

python - 如何将 Python 嵌入到多平台 C++ 框架(JUCE)中?

c++ - Windows GDI 上下文 - LoadImage 和 GetLastError()