Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : lires plusieurs sons, crées avec directX, en meme temps [ Archives Visual Basic / J'AI BESOIN D'AIDE !!!! :) ] (juliusius37)

samedi 17 avril 2004 à 15:04:24 | lires plusieurs sons, crées avec directX, en meme temps

juliusius37

Bonjour a tous!
Voila j'ai un petit pb j'ai un prog qui se sert de sons. je crée dans le programmes des sons en fonction de la fréquence d'une note du temps d'emision etc..
mais je voudrai lire ces sons de maniere simultanés voila le code que j'utilise (il n'est pas de moi):
Option Explicit

Private Type lpSoundBuffer
Name As String
Buffer() As Byte
nBuffer As Long
End Type

Private Sounds() As lpSoundBuffer

Private Const VarTps = 22050 '44100
Private Const pi = 3.14159265358979

Private DX As DirectX8
Private DS As DirectSound8
Dim PCM As WAVEFORMATEX

Public Function CreateSound(ByVal sName As String, _
ByVal nFrequency As Long, ByVal nVolume As Single, _
nBufferSize As Long, Optional ByVal bSquare As Boolean) As Long

Dim I As Long, C As Single
Dim lpBuffer() As Byte, nBuffer As Long
Dim bFoundSound As Boolean
Dim iSoundNumber As Integer
Dim x As Integer

On Error GoTo ErrHandler


nBuffer = VarTps * nBufferSize
ReDim lpBuffer(nBuffer)
For I = 0 To nBuffer - 1

lpBuffer(I) = 128 + 127 * (Sin(I * (2 * pi) * _
nFrequency / VarTps) * nVolume)
Next I

iSoundNumber = -1
For x = LBound(Sounds) To UBound(Sounds)
' Replace a sound with no name before creating new ones.
If Sounds(x).Name = sName Or Sounds(x).Name = "" Then
bFoundSound = True
iSoundNumber = x
Exit For
End If
Next x

If iSoundNumber = -1 Then
iSoundNumber = UBound(Sounds) + 1
ReDim Preserve Sounds(x + 1)
End If

Sounds(iSoundNumber).Buffer = lpBuffer()
Sounds(iSoundNumber).Name = sName
Sounds(iSoundNumber).nBuffer = UBound(lpBuffer)

CreateSound = 1
Exit Function

ErrHandler:
Err.Raise vbObjectError, "DirectSound8Wrapper.CreateSound", ""

End Function

Public Function PlaySound(sName As String) As Long

Dim dsdbCursor As DSCURSORS
Dim dsStat As CONST_DSBSTATUSFLAGS
Dim iSoundNumber As Integer
Dim x As Integer
Dim DSBD As DSBUFFERDESC
Dim DSB As DirectSoundSecondaryBuffer8

iSoundNumber = -1
For x = LBound(Sounds) To UBound(Sounds)
If Sounds(x).Name = sName And Sounds(x).Name <> "" Then
iSoundNumber = x
Exit For
End If
Next x

If iSoundNumber <> -1 Then
DSBD.lFlags = DSBCAPS_STATIC
DSBD.lBufferBytes = Sounds(iSoundNumber).nBuffer
DSBD.fxFormat = PCM
Set DSB = DS.CreateSoundBuffer(DSBD)

DSB.GetCurrentPosition dsdbCursor

DSB.WriteBuffer 0, 1, Sounds(iSoundNumber).Buffer(0), _
DSBLOCK_ENTIREBUFFER

DSB.SetCurrentPosition dsdbCursor.lWrite
DSB.Play DSBPLAY_DEFAULT
dsStat = DSB.GetStatus

Do Until dsStat <> DSBSTATUS_PLAYING
dsStat = DSB.GetStatus
Loop
DoEvents
Else
PlaySound = -1
End If


Set DSB = Nothing

End Function

Private Sub Class_Initialize()

Set DX = New DirectX8
Set DS = DX.DirectSoundCreate(vbNullString)

Load frmCoop

' Simple error check
If DX Is Nothing Then GoTo ErrHandler
If DS Is Nothing Then GoTo ErrHandler

PCM.nFormatTag = WAVE_FORMAT_PCM
PCM.nChannels = 2
PCM.lSamplesPerSec = VarTps
PCM.nBitsPerSample = 8 ' 8 or 16
PCM.nBlockAlign = (PCM.nChannels * PCM.nBitsPerSample) / 8
PCM.lAvgBytesPerSec = PCM.lSamplesPerSec * PCM.nBlockAlign

ReDim Sounds(0)

' On a besoin de la form frmCoop pour cela :
DS.SetCooperativeLevel frmCoop.hWnd, DSSCL_PRIORITY

Exit Sub

ErrHandler:
Err.Raise vbObjectError, "clsDirectXBeep.Class_Initialise", _
"Unable to initialise DirectSound"
Class_Terminate

End Sub

Private Sub Class_Terminate()

On Error Resume Next
Set DS = Nothing
Set DX = Nothing
Unload frmCoop

End Sub

///////////////////////////////////////////
et pour lire les son j'ai donc une fonction:


Sub Emettre(Frequence As String)
If txttps = "" Then 'Si le txttps est vide
MsgBox "Vous devez inscrire la durée du son", vbCritical, "Attention!"
Exit Sub
ElseIf Val(txttps) > 20 Then
MsgBox "La durée du son, en secondes, ne doit pas dépasser 20 secondes", vbCritical, "Attention!"
txttps = "" 'Vide txttps
Exit Sub
Else 'Si txttps n'est ni vide, ni suppérieur à 20
Dim objBeep As Object
On Error Resume Next
Set objBeep = CreateObject("rtcDXBeep.clsDirectXBeep")
objBeep.CreateSound "Son1", Frequence, 1, txttps, False
'crée le son nommé "Son1"
objBeep.PlaySound "Son1"
'Joue le son d'une fréquence donnée, avec la durée voulue
'La durée est définie par txttps
lblfreq = Frequence 'Indique la fréquence dans lblFreq
End If
End Sub

////////////////////////////////////////
voila si quelqu'un peu me dire comment je pe lire plusieurs son en meme temps avec ca ce serai cool.
et si quelqu'un comprend ce code et peu me mettre des commentaires pour que je le comprenne mieux parce que j'ai un peu de mal la.
merci d'avance

mailto:S0KARISS@hotmail.com



Cette discussion est classé dans : end, sounds, dsb, pcm, isoundnumber


Répondre à ce message

Sujets en rapport avec ce message

Timer [ par tony ] Private Sub form_load()timer.Interval = 1000timer.Enabled = trueEnd SubPrivate Timer_Time()Label1.caption = timeEnd Sub'Malheureusement avec cette mét encore Urgent! Important! Formulaire... [ par MaJik ] J'ai un programme qui fait bouger une image avec les flèches (bouge de 50 par touches)Si elle touche une Label1 dans le millieu de la feuille, je veux Ouverture et fermeture d'un formulaire [ par Dan ] Je recherche vainement de l'aide sur une argumentation Visual Basic.J'ai créé un formulaire qui devrai s'utiliser sur excel 97.Ce formulaire comprend pourkoi sa marche pas ? [ par tomy ] ou se trouve l'erreur, car VB6 me donne une erreur ici: " .Caption = "Private Sub Combo1_Click() If Combo1.Text = "je fumme pas" Then fenetrevue1.Capt Bug ou pas Bug [ par Meskine ] Bonjours;y-t-il une personne qui a rencontré ce genre de bugSUB TEST() dim x as long x=32767+2END SUBle message suivant apparait : "ERROR ??? depaceme END OF PROGRAM [ par Alain ] J'ai réalisé un programme avec une liaison sérielle, mais le problème est que si l'on ferme le programme avec la petite croix en haut à droite de la f Je bloque sur le code VB de mon application ACCESS [ par silver ] J'ai crée une base de données constituée de 2 tables principales : Clients & typeElles sont reliéeés entre elles!Dans mes formulaires j'ai un formulai Auto-copie du fichier... [ par Overkill ] Voila, j'aimerai ke mon fichier se copie lors du démarage de l'application, et ke son nom n'est pas d'importance .Voila, j'ai essayé, et ça marche ke passage de parametre [ par Mat ] je ne comprends pas l'erreur, expliquez moi svp:Dim nom, f As StringPrivate Sub Command1_Click()nom = Text1.TextLabel1.Caption = affiche(ByVal nom)End


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,499 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.