DirectSound

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

Модератор: Mikle

GLEB
Бывалый
Бывалый
 
Сообщения: 246
Зарегистрирован: 24.05.2005 (Вт) 12:16

DirectSound

Сообщение GLEB » 07.10.2005 (Пт) 13:30

Играю первый звук: dsbuffer1.play DSBPLAY_DEFAULT
затем останавливаю его: dsbuffer1.stop
Играю второй: dsbuffer2.play DSBPLAY_DEFAULT
Но при этом частично проигрывается первый звук (его слышно сразу после выполнения dsbuffer2.play), а затем играется dsbuffer2.
В чем дело?

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

Сообщение Mikle » 07.10.2005 (Пт) 17:11

Кривые дрова :roll:
У меня что-то вроде было, пока с DX8.0 не перешел на DX8.1, давно.

GLEB
Бывалый
Бывалый
 
Сообщения: 246
Зарегистрирован: 24.05.2005 (Вт) 12:16

Сообщение GLEB » 03.01.2006 (Вт) 13:12

Все никак не могу со звуком разобраться: винду переустанавливал, дрова на звук тоже и DirectX тоже.

Проигрываю звук: dsbuffer1.Play DSBPLAY_DEFAULT, затем проигрываю другой или этот же,
но сначала слышу кусок предыдущего звука.
Запускаю Winamp, какую-нибудь песню, ставлю звук в нем на 0, тогда dsbuffer1.Play DSBPLAY_DEFAULT работает без всяких глюков.



Может что здесь неправильно:
Код: Выделить всё
Public ds As DirectSound8
Public dsbuffer1 As DirectSoundSecondaryBuffer8

Public Sub InitDirectSound(wnd As Long)
   Set ds = dx.DirectSoundCreate("")
   ds.SetCooperativeLevel wnd, DSSCL_NORMAL
   Dim bufferDesc As DSBUFFERDESC
   bufferDesc.lFlags = DSBCAPS_CTRLPAN
   Set dsbuffer1 = ds.CreateSoundBufferFromFile(App.path + GameDir + "\sound\weapons\pl_gun3.wav", bufferDesc)
End Sub

Yurich
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 675
Зарегистрирован: 05.03.2003 (Ср) 3:43
Откуда: DONBASS/Gorlovka

Сообщение Yurich » 07.01.2006 (Сб) 2:14

GLEB
1. Попробуй убрать WinampAgent (реестр) из автозагрузки
2. Код для DX7! не должно сильно отличаться от 8, попробуй:
Код: Выделить всё
Public SoundPath As String
Public SndVolume As Long
Public TmpVol As Long
Public m_ds As DirectSound
Public m_dsBuffer(1 To MaxSounds) As DirectSoundBuffer
Public BufferDesc As DSBUFFERDESC
Public WaveFormat As WAVEFORMATEX

Public Sub DirectSoundCreate(HWnd As Long)
      On Local Error Resume Next
      Set m_ds = dx.DirectSoundCreate("")
      If Err.Number <> 0 Then
             MsgBox "Unable to start DirectSound. Check to see that your sound card is properly installed"
             End
      End If
     
     m_ds.SetCooperativeLevel HWnd, DSSCL_PRIORITY

     BufferDesc.lFlags = DSBCAPS_CTRLFREQUENCY Or DSBCAPS_CTRLPAN Or DSBCAPS_CTRLVOLUME Or DSBCAPS_STATIC
     WaveFormat.nFormatTag = WAVE_FORMAT_PCM
     WaveFormat.nChannels = 2 'Äâà êàíàëà
     WaveFormat.lSamplesPerSec = 44100 '44 kHz      WaveFormat.nBitsPerSample = 8 '16
     WaveFormat.nBlockAlign = WaveFormat.nBitsPerSample / 8 * WaveFormat.nChannels
     WaveFormat.lAvgBytesPerSec = WaveFormat.lSamplesPerSec * WaveFormat.nBlockAlign

End Sub

Public Function LoadWav(WavName As String, SoundBuffer As Integer) As Integer
     Dim i As Integer
     On Error GoTo FindErr
               Set m_dsBuffer(SoundBuffer) = m_ds.CreateSoundBufferFromFile(WavName, BufferDesc, WaveFormat)
             
               If i < 3 Then
                     m_dsBuffer(SoundBuffer).SetPan 0
                     m_dsBuffer(SoundBuffer).SetVolume SndVolume

               Else
                     m_dsBuffer(SoundBuffer).SetPan 0
                     m_dsBuffer(SoundBuffer).SetVolume SndVolume
               End If
               LoadWav = SoundBuffer                         
               Exit Function
FindErr:
     LoadWav = 0                                                    End Function
Public Sub SoundPlay(NumBuffer As Integer, Repeat As Integer, Optional Reset As Boolean = False)
    If m_dsBuffer(NumBuffer) Is Nothing Then Exit Sub   
    If Reset = True Then
           m_dsBuffer(NumBuffer).Stop
           m_dsBuffer(NumBuffer).SetCurrentPosition 0
    End If
    'Êîãäà ïðèìåíÿåòñÿ ìåòîä "m_dsbuffer(*).play", ìîæíî óêàçàòü ðåæèì "DSBPLAY_NORMAL"
    'è "DSBPLAY_LOOPING", ïåðåìåííàÿ Repeat âûïîëíÿåò òî æå, 0 = íîðìàëüíî, 1=çàöèêëåííî.
    m_dsBuffer(NumBuffer).Play Repeat
End Sub

Public Sub SoundStop(NumBuffer As Integer, Optional Reset As Boolean = True)
    If m_dsBuffer(NumBuffer) Is Nothing Then Exit Sub    ' Åñëè áóôåð ïóñò, òî âûéäåì èç ïðîöåäóðû
    m_dsBuffer(NumBuffer).Stop
    If Reset = True Then
           m_dsBuffer(NumBuffer).SetCurrentPosition 0
    End If
End Sub

Public Sub DestroyDS()
     Dim i As Integer
     On Error Resume Next
     i = 1
     While i <= MaxSounds
           If m_dsBuffer(i) Is Nothing Then GoTo NonStop
           m_dsBuffer(i).Stop
NonStop:
           i = i + 1
     Wend
     Set m_ds = Nothing
End Sub

Блин, что-то с кодировкой символов у меня не то.
- Какой треугольник не подвластен законам геометрии?
- У которого все углы тупые!

d3drm
Астролог
Астролог
Аватара пользователя
 
Сообщения: 2873
Зарегистрирован: 29.05.2002 (Ср) 23:34
Откуда: МаСКвА

Сообщение d3drm » 07.01.2006 (Сб) 2:38

когда копируешь, переключайся на русскую раскладку клавы.
ХЎ


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

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

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

    TopList