Ce code permet d'utiliser DirectX (DirectShow) pour lire des fichiers AUDIO.
Il est très pratique pour jouer une musique en arrière plan sans geler votre application.
Le bouclage a été révisé et optimisé afin d'avoir une musique en continue sans raté !
Sympa lorsque l'on souhaite une ambiance nickel, surtout qu'a ma plus grande surprise,
il ne fait pas que lire les MP3 mais bien le type de fichier XM "source du projet".
Une musique en boucle pour un poids de 2 ko !!!
C'est pas merveilleux !
Désactivez le MTA, le debuggeur support mal.
CTRL+ALT+E ou dans le menu <Débugger><Exceptions>
décochez dans <Managed Debugging Assistants> le fameux <LoaderLock>
M'en demandez pas plus, je débute en VB.NET, je n'arriverai même pas à commenter ce que je code.
Pour vous dire, je ne connais pas tous les fichiers supportés par la lib DX; ou bien,
vous expliquer "le pourquoi" et le "comment fonctionne" <MTAThread()>.
On m'aide pas beaucoup alors j'passe ma journée à pondre un code comme celui là sans savoir si il est bien structuré, si la mémoire n'est pas en vrac, si le code est optimisé, si il y aurait une autre manière plus simple...
Format testé: MP3, XM, WAV, WMA
A Tester: avec un fichier en ligne (directshow fait du stream?).
Ayez pitié de moi !
Source / Exemple :
Imports Microsoft.DirectX
Public Class cls_audio
#Region "SHARED DECLARATION"
Friend Shared myThread As System.Threading.Thread
Shared bPLAYING As Boolean = False
Shared bCLOSED As Boolean = True
#End Region
#Region "CLASS SOUND"
Public Class SOUND
<MTAThread()> _
Shared Sub Open(ByVal fSoundMedia As String)
If bPLAYING = False Then
bPLAYING = True
bCLOSED = False
SOUND_FONCTIONS.SoundFile = fSoundMedia
cls_audio.myThread = New System.Threading.Thread(AddressOf SOUND_FONCTIONS.PlayMusic)
cls_audio.myThread = myThread
cls_audio.myThread.Priority = Threading.ThreadPriority.AboveNormal
cls_audio.myThread.Start()
Else
bPLAYING = False
SOUND_FONCTIONS.StopMusic()
End If
End Sub
Shared Property MusicLoop()
Get
MusicLoop = SOUND_FONCTIONS.StartLoop
End Get
Set(ByVal value)
SOUND_FONCTIONS.StartLoop = value
End Set
End Property
Shared Sub Close()
System.Threading.Thread.Sleep(250)
If SOUND_FONCTIONS.SoundFile <> "" Then SOUND_FONCTIONS.StopMusic()
End Sub
End Class
#End Region
#Region "CLASS SOUND_FONCTIONS"
Private Class SOUND_FONCTIONS
Friend Shared SoundFile As String, StartLoop As Boolean
Shared myMusic As Microsoft.DirectX.AudioVideoPlayback.Audio = Nothing
Shared Sub PlayMusic()
myMusic = New Microsoft.DirectX.AudioVideoPlayback.Audio(SoundFile, False)
myMusic.StopWhenReady()
myMusic.Play()
While bCLOSED = False
If myMusic.CurrentPosition = myMusic.Duration Then
If StartLoop = True Then
myMusic.SeekCurrentPosition(0.0, AudioVideoPlayback.SeekPositionFlags.AbsolutePositioning)
ElseIf bPLAYING = False Or bCLOSED = True Then
Exit While
Else
Exit While
End If
End If
System.Threading.Thread.Sleep(100)
If bPLAYING = False Or bCLOSED = True Then Exit Sub
End While
SOUND_FONCTIONS.StopMusic()
End Sub
Shared Sub StopMusic()
If SOUND_FONCTIONS.SoundFile <> "" And bCLOSED = False Or bPLAYING = True Then
myMusic.Stop()
myMusic.Dispose()
myMusic = Nothing
bPLAYING = False
End If
If bCLOSED = False Then
If cls_audio.myThread.IsAlive = True Then cls_audio.myThread.Abort()
cls_audio.myThread = Nothing
End If
bCLOSED = True
End Sub
End Class
#End Region
End Class
Conclusion :
Créez votre fichier avec fasttracker ou téléchargez s'en un sur www.keygenmusic.net
Ensuite, un exemple d'utilisation pour appliquer une musique de fond:
Dans un niveau CLASS / MAIN / SUB NEW:
(a coller juste après le InitializeComponent())
Dim sFile As String = "C:\test.xm"
myPlayer.SOUND.MusicLoop = True
myPlayer.SOUND.Open(sFile)
Dans un niveau CLASS / MAIN / Évènements /:
Public myPlayer As New cls_audio
Sans oublier, par exemple, dans un CLASS / MAIN / FORM_FormClosing:
myPlayer.SOUND.Close()
Vous avec la possibilité de faire un appel direct au thread, exemple:
cls_audio.myThread
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.