Vb8 - lire un fichier xm avec directx (directshow)

Soyez le premier à donner votre avis sur cette source.

Snippet vu 5 136 fois - Téléchargée 17 fois

Contenu du snippet

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

A voir également

Ajouter un commentaire

Commentaire

Messages postés
550
Date d'inscription
jeudi 12 octobre 2006
Statut
Membre
Dernière intervention
6 juin 2015
3
J'ai fait un test sur un windows xp sp3 d'origine, c'est la cata !
Erreur: 0xc0000125
Install de .net fw 1.1

Erreur: nécessite .net fw 2
Install de .net fw 2

Il semble se lancer, sauf qu'il plante 2 secondes après le Thread.Start()

Si quelqu'un a une solution ???

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.