Проблема с DirectXSound

Работа с 2D и 3D графикой, видео, звуком.

Модератор: Mikle

DrKillJoy
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 56
Зарегистрирован: 10.04.2011 (Вс) 10:06

Проблема с DirectXSound

Сообщение DrKillJoy » 07.07.2011 (Чт) 15:05

Вот мой код:
Код: Выделить всё
Imports Microsoft.DirectX
Imports Microsoft.DirectX.DirectSound
Public Class Main
    ' Объявление переменных DirectSound
    Private DirectSound_Device As DirectSound.Device
    Private DirectSound_SecondaryBuffer As DirectSound.SecondaryBuffer

    Private Sub Main_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        ' Инициализация DirectSound
        DirectSound_Device = New DirectSound.Device
        DirectSound_Device.SetCooperativeLevel(Me, CooperativeLevel.Priority)
        DirectSound_SecondaryBuffer = New SecondaryBuffer("C:\Windows Logon Sound.wav", DirectSound_Device)
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        DirectSound_SecondaryBuffer.Play(0, BufferPlayFlags.Default)
    End Sub
End Class

Вот на этой строке
Код: Выделить всё
DirectSound_SecondaryBuffer = New SecondaryBuffer("C:\Windows Logon Sound.wav", DirectSound_Device)
постоянно ошибка: "SoundExсeption не обработано".
Раньше, такого не было. Что я делаю неправильно.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Проблема с DirectXSound

Сообщение Mikle » 07.07.2011 (Чт) 21:27

В эту строку:
Код: Выделить всё
DirectSound_Device.SetCooperativeLevel(Me, CooperativeLevel.Priority)

Подставь вместо "Me" имя формы. Или "Public Class Main" - это и есть форма?
У меня в форме всё работает.
А файл "C:\Windows Logon Sound.wav" реально существует? Если да, то MediaPlayer его проигрывает?

Admiralisimys
Постоялец
Постоялец
 
Сообщения: 318
Зарегистрирован: 01.06.2009 (Пн) 10:26

Re: Проблема с DirectXSound

Сообщение Admiralisimys » 08.07.2011 (Пт) 13:21

А у меня среда (VB.NET 2008 EE) на прогу, основанную на исходном коде из первого сообщения, во время первого запуска выдаёт предупреждение на строчке Application.Run(New Proga()):
Код: Выделить всё
---------------------------
LoaderLock was detected
---------------------------
DLL 'C:\WINDOWS\assembly\GAC\Microsoft.DirectX.DirectSound\
1.0.2902.0__31bf3856ad364e35\Microsoft.DirectX.DirectSound.dll'
is attempting managed execution inside OS Loader lock.
Do not attempt to run managed code inside a DllMain or
image initialization function since doing so can cause the
application to hang.
---------------------------
Troubleshooting tips: Get information about MDAs
Actions: Copy the MDA message to the clipboard
---------------------------

Сам код проги
Код: Выделить всё
'%SystemRoot%\Microsoft.NET\Framework\v1.1.4322\vbc.exe Proga.vb /r:System.dll,System.Drawing.dll,System.Windows.Forms.dll,"%SystemRoot%\Microsoft.NET\DirectX for Managed Code\1.0.2902.0\Microsoft.DirectX.dll","%SystemRoot%\Microsoft.NET\DirectX for Managed Code\1.0.2902.0\Microsoft.DirectX.DirectSound.dll"
Imports System
Imports System.Drawing
Imports System.Windows.Forms

Imports Microsoft.DirectX
Imports Microsoft.DirectX.DirectSound

Class Proga
    Inherits Form

    Private DirectSound_Device As DirectSound.Device
    Private DirectSound_SecondaryBuffer As DirectSound.SecondaryBuffer

    Shared Sub Main()
        Application.Run(New Proga())
    End Sub
    Sub New()
        Dim btn1 As New Button()
        btn1.Parent = Me
        btn1.Text = "Click me..."
        btn1.Size = New Size(95, 25)
        btn1.Location = New Point((ClientSize.Width - btn1.Size.Width) / 2, (ClientSize.Height - btn1.Size.Height) / 2)

        AddHandler btn1.Click, AddressOf ButtonOnClick
    End Sub
    Protected Overrides Sub OnLoad(ByVal ea As EventArgs)
        MyBase.OnLoad(ea)
        ' Инициализация DirectSound
        DirectSound_Device = New DirectSound.Device
        DirectSound_Device.SetCooperativeLevel(Me, CooperativeLevel.Priority)
        DirectSound_SecondaryBuffer = New SecondaryBuffer("C:\WINDOWS\Media\Windows XP Startup.wav", DirectSound_Device)
    End Sub
    Private Sub ButtonOnClick(ByVal obj As Object, ByVal ea As EventArgs)
        DirectSound_SecondaryBuffer.Play(0, BufferPlayFlags.Default)
    End Sub
    Protected Overrides Sub OnClosed(ByVal ea As EventArgs)
        MyBase.OnClosed(ea)
        DirectSound_SecondaryBuffer.Dispose()
        DirectSound_Device.Dispose()
    End Sub
End Class

Проигнорировав предупреждения, прога нормально функционирует.

DrKillJoy
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 56
Зарегистрирован: 10.04.2011 (Вс) 10:06

Re: Проблема с DirectXSound

Сообщение DrKillJoy » 08.07.2011 (Пт) 17:54

Спасибо всем, кто откликнулся. Я сам разобрался, если это можно назвать так...
Все дело было в файле. Я его копировал из системных файлов и с ним программа не запускалась, потом взял другой файл из игры и с ним все заработало.
Как это может быть? Разница структуры файла, хотя оба файла имеют формат wav.
Может кто объяснить?

Admiralisimys
Постоялец
Постоялец
 
Сообщения: 318
Зарегистрирован: 01.06.2009 (Пн) 10:26

Re: Проблема с DirectXSound

Сообщение Admiralisimys » 08.07.2011 (Пт) 20:10

В моём примере прога вовсе играет из системной директории файл - C:\WINDOWS\Media\Windows XP Startup.wav
Так что, врятле в этом дело.
После того как копировал из системных файлов,
Mikle писал(а):MediaPlayer его проигрывает?

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Проблема с DirectXSound

Сообщение Mikle » 08.07.2011 (Пт) 22:24

С помощью DirectSound занрузчика можно прочитать только Windows PCM формат. Но Wav существует и других форматов, то есть, даже если его воспроизводит MediaPlayer, он не обязан загружаться в DirectSound.

DrKillJoy
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 56
Зарегистрирован: 10.04.2011 (Вс) 10:06

Re: Проблема с DirectXSound

Сообщение DrKillJoy » 09.07.2011 (Сб) 19:12

Admiralisimys, файл взят там же где и ваш, я просто копировал его в корень диска "С". Думал, может дело в пути к файлу.
MediaPlayer он проигрывается, но при выполнении программы выдается ошибка.
Mikle, а есть ли какие особые критерии к файлу? Может только моно или частота должна быть определенной?
А как задавать параметры проигрываемого звука: громкость, баланс и т.д.?

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Проблема с DirectXSound

Сообщение Mikle » 09.07.2011 (Сб) 20:40

DrKillJoy писал(а):есть ли какие особые критерии к файлу?

Я же написал - только Windows PCM формат. Можно моно или стерео, 8 или 16 бит, с частотой дискретизации в пределах поддержки звуковой карты.
DrKillJoy писал(а):как задавать параметры проигрываемого звука: громкость, баланс и т.д.?

При создании буфера задавай флагами параметры, которые хочешь менять, это в обычном DX (не Managed):
Код: Выделить всё
Set DSB = DS.CreateSoundBuffer(2, 8, 22050, Sz, DSBCAPS_CTRLVOLUME Or DSBCAPS_CTRLPAN Or DSBCAPS_CTRLFREQUENCY)

То есть я хочу контролировать громкость, частоту и панораму.
Потом вызывешь соответствующий метод у буфера:.SetVolume, .SetPan или .SetFrequency.

DrKillJoy
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 56
Зарегистрирован: 10.04.2011 (Вс) 10:06

Re: Проблема с DirectXSound

Сообщение DrKillJoy » 10.07.2011 (Вс) 18:28

Mikle, а можно, по подробнее и относительно моего кода?
При создании буфера задавай флагами параметры, которые хочешь менять, это в обычном DX (не Managed):

Это при объявлении или при создании нового буфера?
Что такое Managed?

DrKillJoy
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 56
Зарегистрирован: 10.04.2011 (Вс) 10:06

Re: Проблема с DirectXSound

Сообщение DrKillJoy » 10.07.2011 (Вс) 18:54

Вот нашел еще одно решение в бескрайних просторах интернета... но оно тоже не работает.
Код: Выделить всё
Imports Microsoft.DirectX
Imports Microsoft.DirectX.DirectSound
Public Class Main
    ' Объявление переменных DirectSound
    Private DirectSound_Device As DirectSound.Device
    Private DirectSound_SecondaryBuffer As DirectSound.SecondaryBuffer

    Private Sub Main_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        ' Инициализация DirectSound
        DirectSound_Device = New DirectSound.Device
        DirectSound_Device.SetCooperativeLevel(Me, CooperativeLevel.Priority)
        Dim BD As New BufferDescription
        BD.ControlPan = True
        BD.ControlVolume = True
        BD.ControlFrequency = True
        BD.ControlEffects = True
        'control sound channel
        BD.Flags = BufferDescriptionFlags.GlobalFocus
        DirectSound_Device.SetCooperativeLevel(Me.Handle, CooperativeLevel.Normal)
        DirectSound_SecondaryBuffer = New SecondaryBuffer(Application.StartupPath & "\Data\Sound\cow.wav", BD, DirectSound_Device)
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
         DirectSound_SecondaryBuffer.Play(0, BufferPlayFlags.Looping)
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        DirectSound_SecondaryBuffer.Stop()
    End Sub
' Здесь, я пытаюсь изменить параметры воспроизведения звука
    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
        DirectSound_SecondaryBuffer.Volume = -500
    End Sub

    Private Sub HScrollBar1_Scroll(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ScrollEventArgs) Handles HScrollBar1.Scroll
        DirectSound_SecondaryBuffer.Pan = HScrollBar1.Value
    End Sub
End Class

Этот вариант тоже не работает... надеюсь на вашу помощь, так как других методов, я не знаю.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Проблема с DirectXSound

Сообщение Mikle » 10.07.2011 (Вс) 19:52

DrKillJoy писал(а):Это при объявлении или при создании нового буфера?

Я же написал - при создании (create).
DrKillJoy писал(а):Что такое Managed

Ресурс создан с флагом D3DPOOL_MANAGED.
Если не работает, проверь сначала какой-нибудь заведомо рабочий WAV-файл, например "C:\WINDOWS\Media\tada.wav". Это в XP, не уверен, что есть в семёрке.

DrKillJoy
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 56
Зарегистрирован: 10.04.2011 (Вс) 10:06

Re: Проблема с DirectXSound

Сообщение DrKillJoy » 10.07.2011 (Вс) 20:27

Но я создаю(присваиваю) его через new.
Код: Выделить всё
DirectSound_SecondaryBuffer = New SecondaryBuffer(Application.StartupPath & "\Data\Sound\cow.wav", BD, DirectSound_Device)

Если следовать твоей логике, то в твоем коде DSB это DirectSound.SecondaryBuffer, а DS это DirectSound соответственно, если это не так, то поправь меня.
Если вставить твой код в проект, то получится ошибка: CreateSoundBuffer не является членом DirectSound.
Я чего-то не могу разобраться.

Admiralisimys
Постоялец
Постоялец
 
Сообщения: 318
Зарегистрирован: 01.06.2009 (Пн) 10:26

Re: Проблема с DirectXSound

Сообщение Admiralisimys » 10.07.2011 (Вс) 20:59

DrKillJoy
  • открой блокнот,
  • скопируй туда код проги с третьего сообщения темы,
  • сохрани файл под именем Proga.vb,
  • зайди в Пуск->Выполнить напиши cmd и нажми Enter,
  • перейди командой cd в папку в которой сохранил proga.vb (например сd C:\My Docs) и выполни там команду (скопируй следующую строчку и вставь в консоль правой кнопкой мыши, нажми Enter)
    %SystemRoot%\Microsoft.NET\Framework\v1.1.4322\vbc.exe Proga.vb /r:System.dll,System.Drawing.dll,System.Windows.Forms.dll,"%SystemRoot%\Microsoft.NET\DirectX for Managed Code\1.0.2902.0\Microsoft.DirectX.dll","%SystemRoot%\Microsoft.NET\DirectX for Managed Code\1.0.2902.0\Microsoft.DirectX.DirectSound.dll"
    либо
    %SystemRoot%\Microsoft.NET\Framework\v3.5\vbc.exe Proga.vb /r:System.dll,System.Drawing.dll,System.Windows.Forms.dll,"%SystemRoot%\Microsoft.NET\DirectX for Managed Code\1.0.2902.0\Microsoft.DirectX.dll","%SystemRoot%\Microsoft.NET\DirectX for Managed Code\1.0.2902.0\Microsoft.DirectX.DirectSound.dll"
  • Запусти полученный файл.

DrKillJoy
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 56
Зарегистрирован: 10.04.2011 (Вс) 10:06

Re: Проблема с DirectXSound

Сообщение DrKillJoy » 10.07.2011 (Вс) 21:16

Так... Admiralisimys, я сделал это... но, что сделал, я не понял.
После проделанного мною, скомпилировался файл. Я его запустил... он не заработал.
Тогда, я переделал код программы, а именно заменил звуковой файл на свой, и у меня все заработало...
Какой из этого можно сделать вывод? И что я вообще делал?

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Проблема с DirectXSound

Сообщение Mikle » 10.07.2011 (Вс) 21:24

dim as new - это одновременное и создание и объявление. Повторю - твой код из п.0 у меня работает, я в VB2008 создал новый form-проект, переименовал форму в Main, добавил в меню референсы Microsoft.DirectX и Microsoft.DirectX.DirectSound и создал кнопку Button1, вставил твой код, но вместо "C:\Windows Logon Sound.wav" вписал "C:\WINDOWS\Media\tada.wav". Если у тебя так не заработает, посмотри в панели управления, является ли звучка первичным устройством воспроизведения, трудно предположить ещё что-нибудь.

DrKillJoy
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 56
Зарегистрирован: 10.04.2011 (Вс) 10:06

Re: Проблема с DirectXSound

Сообщение DrKillJoy » 10.07.2011 (Вс) 21:32

Mikle, извини, но ты меня не так понял, а может я тебя сам сбил с толку.
Я смог добиться того, что теперь у меня звук производится, но как только я пытаюсь сменить атрибуты(громкость, баланс), выдается ошибка.
Смотри код из моего пятого сообщения.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Проблема с DirectXSound

Сообщение Mikle » 10.07.2011 (Вс) 21:53

Код: Выделить всё
BD.Flags = BufferDescriptionFlags.GlobalFocus Or BufferDescriptionFlags.ControlVolume Or BufferDescriptionFlags.ControlPan

DrKillJoy
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 56
Зарегистрирован: 10.04.2011 (Вс) 10:06

Re: Проблема с DirectXSound

Сообщение DrKillJoy » 10.07.2011 (Вс) 22:08

Спасибо Mikle, ты мне очень помог. Теперь все работает.
Еще небольшой вопросик, если знаешь.
Какие варианты может принять ControlEffects и что он дает?

Admiralisimys
Постоялец
Постоялец
 
Сообщения: 318
Зарегистрирован: 01.06.2009 (Пн) 10:26

Re: Проблема с DirectXSound

Сообщение Admiralisimys » 10.07.2011 (Вс) 22:56

DrKillJoy это процедура непосредственной сборки из исходника, дабы нивелировать возможные проблемы с настройками проекта.
Если указанный в третьем сообщении файл (C:\WINDOWS\Media\Windows XP Startup.wav) присутствовал, но по нажатию на кнопку Click me... не воспроизводился, то это странно.

DrKillJoy
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 56
Зарегистрирован: 10.04.2011 (Вс) 10:06

Re: Проблема с DirectXSound

Сообщение DrKillJoy » 11.07.2011 (Пн) 6:34

Admiralisimys, а я и не знал, что так можно.
Файл указанный в третьем сообщении присутствовал, но почему-то все файлы ОС из этой папки не хотят воспроизводиться.
Но если вставить другой звуковой файл, то все прекрасно запускается. Дело в самом звуковом файле.
Admiralisimys, а ты знаешь какие варианты может принять ControlEffects и что он дает?

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: Проблема с DirectXSound

Сообщение FireFenix » 11.07.2011 (Пн) 13:05

DrKillJoy писал(а):а ты знаешь какие варианты может принять ControlEffects и что он дает?

Ох великий гугл
http://msdn.microsoft.com/en-us/library/bb280899%28v=vs.85%29.aspx
http://msdn.microsoft.com/en-us/library/bb319143%28v=vs.85%29.aspx
Очевидно в обоих случаях может принимать значения только True или False

ControlEffects используется совместно с EffectDescription, почитать об этом можно тут http://channel9.msdn.com/coding4fun/articles/Beginning-Game-Development-Part-IX-Direct-Sound-Part-II
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

DrKillJoy
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 56
Зарегистрирован: 10.04.2011 (Вс) 10:06

Re: Проблема с DirectXSound

Сообщение DrKillJoy » 11.07.2011 (Пн) 13:55

Спасибо FireFenix, хотя толком ничего не понял, но попробую разобраться.


Вернуться в Мультимедиа

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3

    TopList