本篇主要介绍音频的采集技术,使用的是WASAPI技术。
技术简介
WASAPI全称是Windows Audio Session API(Windows音频会话API),是从Windows Vista之后引入的UAA(Universal Audio Architecture)音频架构所属的API。
主要流程和代码
1、初始化采集器
int WasapiCaptor::init(bool isMic, const std::string& deviceId, const std::string& deviceName)
{
int err = ERROR_CODE_OK;
if (!m_comInited) {
err = ERROR_CODE_COM_INIT_FAILED;
return err;
}
if (m_inited) {
return err;
}
m_isMic = isMic;
m_deviceId = deviceId;
m_deviceName = deviceName;
do {
HRESULT hr = CoCreateInstance(__uuidof(MMDeviceEnumerator), nullptr, CLSCTX_ALL,
__uuidof(IMMDeviceEnumerator), (void**)&m_deviceEnumerator);
if (FAILED(hr)) {
err = ERROR_CODE_COM_CREATE_INSTANCE_FAILED;
break;
}
hr = m_deviceEnumerator->GetDevice(HELPER::StringConverter::convertUtf8ToUnicode(m_deviceId).c_str(), &m_endpointDevice);
if (FAILED(hr)) {
err = ERROR_CODE_COM_GET_AUDIO_ENDPOINT_FAILED;
break;
}
hr = m_endpointDevice->Activate(__uuidof(IAudioClient), CLSCTX_ALL, nullptr, (void**)&m_captureClient);
if (FAILED(hr)) {
err = ERROR_CODE_COM_ACTIVE_DEVICE_FAILED;
break;
}
hr = m_captureClient->GetMixFormat(&m_waveFmt);
if (FAILED(hr)) {
err = ERROR_CODE_COM_GET_MIX_FORMAT_FAILED;
break;
}
initFromMixFormat(m_waveFmt);
DWORD streamFlags = AUDCLNT_STREAMFLAGS_EVENTCALLBACK;
if (!m_isMic) {
streamFlags |= AUDCLNT_STREAMFLAGS_LOOPBACK;
}
hr = m_captureClient->Initialize(AUDCLNT_SHAREMODE_SHARED, streamFlags, WASAPI_CAPTOR_REF_TIME_PER_SEC, 0, m_waveFmt, nullptr);
if (FAILED(hr)) {
err = ERROR_CODE_COM_INIT_AUDIO_CLIENT_FAILED;
break;
}
// For ouotput mode, capture event will not signal when there is nothing rendering,
// so we run a render thread and rendering silent pcm data all the time.
if (!m_isMic) {
err = initRenderer();
HCMDR_ERROR_CODE_BREAK(err);
}
hr = m_captureClient->GetBufferSize(&m_captureSampleCount);
if (FAILED(hr)) {
err = ERROR_CODE_COM_GET_BUFFER_SIZE_FAILED;
break;
}
hr = m_captureClient->GetService(__uuidof(IAudioCaptureClient), (void**)&m_captor);
if (FAILED(hr)) {
err = ERROR_CODE_COM_GET_CAPTOR_FAILED;
break;