Пишу небольшую игрушку на WPF, и для одновременного воспроизведения многих звуков использую DirectSound. До этого пытался использовать AudioVideoPlayback, но была точно такая же проблема. Я добавил в проект ссылку на DirectSound.dll из папки DirectX.
Прописал
using Microsoft.DirectX.DirectSound;
Вот эти строки отвечают за инициализацию:
Microsoft.DirectX.DirectSound.Buffer sp;
Microsoft.DirectX.DirectSound.Buffer deathSp;
Device m_SoundDevice;
В конструкторе окна выделяю память, подгружаю все:
m_SoundDevice = new Device();
m_SoundDevice.SetCooperativeLevel((new system.Windows.Interop.WindowInteropHelper(this)).Handle, CooperativeLevel.Priority);
sp = new Microsoft.DirectX.DirectSound.Buffer("Shot2.wav", m_SoundDevice);
deathSp = new Microsoft.DirectX.DirectSound.Buffer("Death1.wav", m_SoundDevice);
Проблема состоит в том, что если в свойствах проекта стоит .NET 4.0 или выше, то при отладке студия иногда просто зависает, и закрывается только завершением процесса студии, иногда сразу же выдает ошибку, как при версиях 3.Х. Скомпилированный при этом экзешник выдает ошибку при запуске. Если понизить версию .NET до 3.5 или 3.0, то при отладке программа запускается, но вылетает при инициализации, которую я указал выше. Пишет следующее:
Нет доступных исходных файлов. В стеке
вызова содержится только внешний код.
XamlParseException не обработано
"Вызов конструктора для типа
"Game.MainWindow", удовлетворяющего
указанным ограничениям привязки,
привел к выдаче исключения.": номер
строки "3" и позиция в строке "9".
Я не пойму, в чем причина. Где эта третья строка - тоже. В xaml в 3ей строке ничего интересного, как и в самом коде на 3ей строке.
Ответ
Уфф, я разобрался в проблеме. Причина была в том, что задавать CooperativeLevel для SoundDevice нельзя во время инициализации нашего MainWindow. Инициализацию всего DirectSound нужно вешать на событие OnLoad нашего главного окна, либо в любой момент после завершения его инициализации.
Комментариев нет:
Отправить комментарий