声卡数据采集
Loopback 录制模式
在 loopback 模式下,WASAPI 的客户端可以捕获 rendering endpoint 设备(通常即声卡)正在播放的音频流。
客户端只能为共享模式流(AUDCLNT_SHAREMODE_SHARED)启用 loopback 模式。 独占模式(AUDCLNT_SHAREMODE_EXCLUSIVE)流不能在 loopback 模式下运行。
WASAPI 系统模块在软件中实现环回模式。在 loopback 模式下,WASAPI 将来自音频引擎的输出流复制到应用程序的捕获缓冲区中。
Windows 从 Vista 开始支持数字版权管理(DRM)。内容提供商依靠 DRM 来保护其专有音乐或其他内容免受未经授权的复制和其他非法使用。WASAPI 不允许 loopback 录制包含 DRM 保护内容的数字流。
无论音频源自哪个终端服务会话(session),WASAPI loopback 都包含正在播放的所有音频的混合。
Loopback 录制代码
以下是概要的 loopback 录制代码,省略类的具体实现和错误处理:
CWavFileHelper g_recWavFile;
void onAudioCaptured(BYTE* pData, DWORD len)
{
g_recWavFile.append((const char*)pData, len);
}
int _tmain(int argc, _TCHAR* argv[])
{
HRESULT hr = E_FAIL;
hr = CoInitialize(NULL);
LoopackAudCap audCap;
hr = audCap.init(onAudioCaptured);
hr = g_recWavFile.create(argv[1], *audCap.getWavFormat());
hr = audCap.start();
_tprintf(_T("Started recording...press Enter to stop recording.\n"));
char ch = getchar(); // wait for keyboard input and then stop the recording
hr = audCap.stop();
audCap.finaize();
g_recWavFile.close();
CoUninitialize();
return hr;
}
LoopackAudCap::init 函数
typedef void (*PFON_AUD_CAPTURED)(BYTE* pData, DWORD len);
HRESULT init(PFON_AUD_CAPTURED pCallback)
{
HRESULT hr = E_FAIL;
CComPtr<IMMDevice> pSpeaker = NULL;
MMDeviceHelper device;
WAVEFORMATEX *pwfx = NULL;
m_pCallback = pCallback;
m_hStartEvent = CreateEvent<