首页 > 解决方案 > IDirectSound8::CreateSoundBuffer 返回 DSERR_BUFFERLOST

问题描述

返回 DSERR_BUFFERLOST 的 IDirectSound8::CreateSoundBuffer 是什么意思?

根据文档DSERR_BUFFERLOST 不是来自 CreateSoundBuffer 的有效返回码。

我们的两个用户报告了 CreateSoundBuffer 返回 DSERR_BUFFERLOST(数百个)的错误。我们已将带有此代码的产品交付给数千名用户,而没有报告任何问题。两位用户都报告说拥有最新的声音驱动程序。一个报告有一台 Alienware 17 R4 笔记本电脑,另一个是 MSI 笔记本电脑。

Windows-10 上的一位用户报告说,使用 Windows-8 兼容模式修复了此问题。

其他互联网参考资料包括此链接。一位用户尝试重新启动他们的 Windows 音频服务,但没有任何效果。此链接似乎描述了另一个游戏中的相同问题。

这是该调用的其余设置:

WAVEFORMATEX w = {};
w.wFormatTag = WAVE_FORMAT_PCM;
w.nSamplesPerSec = pSoundData->sampleRate;
w.wBitsPerSample = (WORD)pSoundData->bitsPerSample;
w.nChannels = (WORD)pSoundData->numChannels;

w.nBlockAlign = w.nChannels * w.wBitsPerSample / 8;
w.nAvgBytesPerSec = w.nSamplesPerSec * w.nBlockAlign;
w.cbSize = 0;

int bufferSize = pSoundData->decodedSize;


int bufferFlags = DSBCAPS_GETCURRENTPOSITION2 | DSBCAPS_CTRLVOLUME | DSBCAPS_CTRLFREQUENCY | DSBCAPS_CTRLPAN | DSBCAPS_GLOBALFOCUS;

DSBUFFERDESC bufferDesc = { sizeof(DSBUFFERDESC), (DWORD)bufferFlags, (DWORD)bufferSize, 0, &w, DS3DALG_DEFAULT };


LPDIRECTSOUNDBUFFER pBuffer;
HRESULT hr = pSoundInterface->mDevice->CreateSoundBuffer(&bufferDesc, &pBuffer, NULL);

标签: windowsaudiodirectxwavdirectsound

解决方案


DirectSound 文档已经很久没有被编辑过了,但我可以告诉你,这DSERR_BUFFERLOST是来自多种方法的有效错误:GetCurrentPositionPlayStopLockUnlockRestore.

自 Windows Vista 以来所有版本的 Windows 上的 DirectSound 根本不是“直接”的。它使用 Windows Core Audio (WASAPI) 来输出。您获得 a 的主要原因DSERR_BUFFERLOST是每当您从 WASAPI 获得“严重错误”时。通常,这仅在您丢失当前播放设备时才会发生,但它在内部处理以切换设备,因此这里不应该出现这种情况。

如果您能够重现此问题,您可以尝试启用 DirectSound ETW 事件以查找此处发生的错误代码。

8a93b54b-c75a-49b5-a5be-9060715b1a33    Microsoft-Windows-DirectSound
ae4bd3be-f36f-45b6-8d21-bdd6fb832853    Microsoft-Windows-Audio

否则,它可能是驱动程序或硬件错误。


推荐阅读