IDirectSound8::CreateSoundBuffer возвращает DSERR_BUFFERLOST

#windows #audio #directx #wav #directsound

#Windows #Аудио #directx #wav #directsound

Вопрос:

Что означает IDirectSound8::CreateSoundBuffer, возвращающий DSERR_BUFFERLOST?

Согласно документации, DSERR_BUFFERLOST не является допустимым кодом возврата из CreateSoundBuffer .

Два наших пользователя сообщают об ошибках, когда CreateSoundBuffer возвращает DSERR_BUFFERLOST (из сотен). Мы отправили продукты с этим кодом тысячам пользователей без каких-либо сообщений о проблемах. Оба пользователя сообщают о наличии последних звуковых драйверов. Один сообщает о наличии ноутбука Alienware 17 R4, а другой — ноутбука MSI.

Один пользователь в Windows-10 сообщил, что использование режима совместимости с Windows-8 устранило эту проблему.

Другие ссылки в Интернете включают эту ссылку. Один пользователь попытался перезапустить свою службу Windows Audio, но это не дало никакого эффекта. Эта ссылка, похоже, описывает идентичную проблему в другой игре.

Вот остальная часть настройки для этого вызова:

 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, amp;w, DS3DALG_DEFAULT };


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

Комментарии:

1. Существует ли конкретная версия ОС, участвующая в воспроизведении? DirectSound был устаревшим в течение многих лет, поэтому большая его часть эмулируется современными версиями Windows, поэтому важно знать, какая версия ОС.

2. Ноутбуки достаточно современные, я был бы удивлен, если это что-то другое, кроме Windows 10, но я попросил их убедиться. Обратите внимание, что этот код успешно выполняется на других компьютерах с Windows 10.

Ответ №1:

Документы DirectSound не редактировались целую вечность, но я могу сказать вам, что DSERR_BUFFERLOST это допустимая ошибка из-за ряда методов: GetCurrentPosition , Play , Stop , Lock , Unlock , и Restore .

DirectSound во всех версиях Windows, поскольку Windows Vista вообще не является «прямым». Для вывода используется 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
  

В противном случае это может быть ошибка драйвера или аппаратного обеспечения.