Visual c++ WASAPI没有声音输出
我在WASAPI方面遇到了问题。它不输出任何声音,我已经检查了写入缓冲区的数据 因为它不输出任何声音,我没有任何想法来找出问题 它在下面的代码中可能有一些问题Visual c++ WASAPI没有声音输出,visual-c++,wasapi,Visual C++,Wasapi,我在WASAPI方面遇到了问题。它不输出任何声音,我已经检查了写入缓冲区的数据 因为它不输出任何声音,我没有任何想法来找出问题 它在下面的代码中可能有一些问题 SoundStream::SoundStream() : writtenCursor(0), writeCursor(0), distroy(false) { IMMDeviceEnumerator * pEnumerator = nullptr; HResult(CoCreateInstance(__uuidof(MM
SoundStream::SoundStream() : writtenCursor(0), writeCursor(0), distroy(false)
{
IMMDeviceEnumerator * pEnumerator = nullptr;
HResult(CoCreateInstance(__uuidof(MMDeviceEnumerator), NULL, CLSCTX_ALL, IID_PPV_ARGS(&pEnumerator)));
IMMDevice * pDevice = nullptr;
HResult(pEnumerator->GetDefaultAudioEndpoint(eRender, eMultimedia, &pDevice));
SafeRelease(&pEnumerator);
HResult(pDevice->Activate(__uuidof(IAudioClient), CLSCTX_ALL, NULL, (void**)&pAudioClient));
SafeRelease(&pDevice);
WAVEFORMATEXTENSIBLE * pwfx = nullptr;
hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
REFERENCE_TIME hnsRequestedDuration = REFTIMES_PER_SEC * 2;
HResult(pAudioClient->GetMixFormat((WAVEFORMATEX**)&pwfx));
HResult(pAudioClient->Initialize(
AUDCLNT_SHAREMODE_SHARED,
AUDCLNT_STREAMFLAGS_EVENTCALLBACK,
hnsRequestedDuration,
0,
(WAVEFORMATEX*)pwfx,
NULL));
pAudioClient->SetEventHandle(hEvent);
channel = (size_t)pwfx->Format.nChannels;
bits = (size_t)pwfx->Format.wBitsPerSample;
validBits = (size_t)pwfx->Samples.wValidBitsPerSample;
frequency = (size_t)pwfx->Format.nSamplesPerSec;
buffer.reshape({ 0, channel, bits >> 3 });
CoTaskMemFree(pwfx);
HResult(pAudioClient->GetBufferSize(&bufferFrameCount));
HResult(pAudioClient->Start());
if (pAudioClient)
{
thread = std::thread([&]()
{
this->Sync();
});
}
}
您可以在上查看我的WASAPI.cpp代码(该代码运行良好) 您还应检查预期的波形格式是否为float:
//SubFormat 00000003-0000-0010-8000-00aa00389b71 defines KSDATAFORMAT_SUBTYPE_IEEE_FLOAT
//SubFormat 00000001-0000-0010-8000-00aa00389b71 defines KSDATAFORMAT_SUBTYPE_PCM
GUID G;
WORD V;
WAVEFORMATEX *pwfx = NULL;
bool itsfloat;
pAudioClient->GetMixFormat(&pwfx);
// Do we received a WAVEFORMATEXTENSIBLE?
if(pwfx.cbSize >= 22) {
G = ((WAVEFORMATEXTENSIBLE*)pwfx)->SubFormat;
V = ((WAVEFORMATEXTENSIBLE*)pwfx)->Samples.wValidBitsPerSample;
if (G.Data1 == 3) itsfloat = true;
else if (G.Data1 == 1) itsfloat = false;
}
因为“pwfx.cbSize>=22”,您知道您收到的是一个WaveFormatTextEnable,而不是一个简单的WaveFormatTex
更多信息请访问:IAudioClient::GetMixFormat
波形可感知
您可以再次查看我的WASAPI.cpp代码。 现在它可以在共享模式和独占模式下工作。
我应该注意的是,在共享模式下,不需要转换波形格式或波形——Windows负责转换和转换用于混合波形的格式。发布的代码不会向设备发送任何数据。我通过另一个函数执行发送操作。它的声音带有AUDCLNT\u SHAREMODE\u EXCLUSIVE模式,但我希望AUDCLNT\u SHAREMODE\u SHARED Mode使用复杂的GetMixFormat可能存在一个问题。我刚刚将它添加到我的WASAPI.cpp:GUID G;G=((波形可理解*)内部波形)->子格式;//子格式00000003-0000-0010-8000-00aa00389b71定义KSDATAFORMAT_SUBTYPE_IEEE_FLOAT//子格式00000001-0000-0010-8000-00aa00389b71定义KSDATAFORMAT_SUBTYPE_PCM,如果(G.Data1==3)其FLOAT=true;如果(G.Data1==1)itsfloat=false,则为else;单词V;V=((波形可感测*)internalwaveformat)->Samples.wValidBitsPerSample;但它可以使用系统提供的AUDCLNT\U SHAREMODE\U SHAREDI混合格式来获取它。我不知道它以前可能用过浮点型。