Я слепой программист, работающий над аудио-игрой для слепых. Я использую SlimDX, и он был протестирован на десятках систем от XP до Win 8.1. Мой код работает на большинстве систем просто отлично, но я получаю следующую ошибку во время выполнения на нескольких старых системах XP:
vupgraderacer.wav SlimDX.DirectSound.DirectSoundException:
DSERR_INVALIDCALL: этот вызов недопустим для текущего состояния этого объекта (-2005401550)
at SlimDX.Result.Throw[T](Object dataKey, Object dataValue) at SlimDX.Result.Record[T](Int32 hr, Boolean failed, Object dataKey, Object dataValue) at SlimDX.DirectSound.SecondarySoundBuffer..ctor(DirectSound device, SoundBufferDescription description) at RR.Sound..ctor(String fileName)
Та же ошибка повторяется для каждого звука, который он пытается использовать. Вот код, который я использую для настройки устройства DS:
dsDevice = Новый SlimDX.DirectSound.DirectSound
dsDevice.SetCooperativeLevel (OGw.Handle, SlimDX.DirectSound.CooperativeLevel.Normal)
Я понимаю, что есть другие флаги, которые можно установить, но пока эта базовая установка работала хорошо, за исключением старых систем XP. Это мой первый пост, поэтому надеюсь, что я вхожу в него правильно, если нет, пожалуйста, дайте мне знать, иногда трудно сказать, где вы находитесь или должны быть с программой для чтения экрана на форумах.
SetCooperativeLevel()
? Он возвращаетHRESULT
любое значение, отличное от того, котороеDS_OK
может указывать на проблему.Ответы:
Вы должны проверить результат SetCooperativeLevel ().
Согласно документации версии DirectSound8, это возможные возвращаемые значения:
Узнайте, какой из них вы получите первым. Может быть, вы просто забыли инициализировать звуковое устройство?
Кроме того, в разделе замечаний говорится: «Не вызывайте этот метод, если какие-либо буферы заблокированы».
Документы: http://msdn.microsoft.com/en-us/library/windows/desktop/microsoft.directx_sdk.idirectsound8.idirectsound8.setcooperativelevel%28v=vs.85%29.aspx
источник