Comment faire une boucle par délegation ? [Résolu]

Messages postés
553
Date d'inscription
jeudi 12 octobre 2006
Dernière intervention
6 juin 2015
- - Dernière réponse : Duke49
Messages postés
553
Date d'inscription
jeudi 12 octobre 2006
Dernière intervention
6 juin 2015
- 3 nov. 2010 à 16:29
Bonjour,

voici le ptit code que j'me construit et je sèche sur cette histoire de délégation qui n'existait pas en VB6 !

#Region "MUSIC"
    Private bPLAY As Boolean = False
    Private bLOOP As Boolean = False
    Dim myMusic As Audio = Nothing
    Dim myMusicLoop As System.ComponentModel.EventHandlerList

    Private Sub MusicEndsLoop(ByVal sender As Object, ByVal e As System.EventArgs)
        myMusic.CurrentPosition = 0
    End Sub

    Public Sub PlayMusic(ByVal fSoundMedia As String)
        Dim d As System.Delegate

        If bPLAY = False Then
            myMusic = New Audio(fSoundMedia, True)
            myMusic.Play()
            bPLAY = True
            If bLOOP = True Then
                myMusicLoop.AddHandler(myMusic.Stopped, ?)
            Else
                myMusicLoop.RemoveHandler(myMusic.Stopped, ?)
            End If
        Else
            myMusic.Stop()
            myMusic.Dispose()
            myMusic = Nothing
            bPLAY = False
        End If
    End Sub
#End Region


MERCI D'AVANCE !
Afficher la suite 

Votre réponse

14 réponses

Meilleure réponse
Messages postés
553
Date d'inscription
jeudi 12 octobre 2006
Dernière intervention
6 juin 2015
3
Merci
C BON, SA FONCTIONNE BIEN, MERCI POUR L'AIDE Duke49 !

Imports Microsoft.DirectX

Public Class cls_audio
    Friend Shared myThread As System.Threading.Thread
    Shared bPLAYING As Boolean = False

#Region "CLASS SOUND"
    Public Class SOUND
        <MTAThread()> _
        Shared Sub Open(ByVal fSoundMedia As String)
            If bPLAYING = False Then
                bPLAYING = True
                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.BelowNormal
                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)
            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.Play()
            While myMusic.Playing True And bPLAYING True
                If myMusic.CurrentPosition = myMusic.Duration Then
                    If StartLoop True And bPLAYING True Then
                        myMusic.StopWhenReady()
                        myMusic.CurrentPosition = 0
                        myMusic.Play()
                    Else
                        Exit While
                    End If
                End If
                System.Threading.Thread.Sleep(250)
            End While
            SOUND_FONCTIONS.StopMusic()
        End Sub

        Shared Sub StopMusic()
            bPLAYING = False
            myMusic.Stop()
            myMusic.Dispose()
            myMusic = Nothing
            If cls_audio.myThread.IsAlive = True Then cls_audio.myThread.Abort()
        End Sub
    End Class
#End Region

End Class

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 96 internautes nous ont dit merci ce mois-ci

Commenter la réponse de Duke49
Messages postés
553
Date d'inscription
jeudi 12 octobre 2006
Dernière intervention
6 juin 2015
0
Merci
En fesant:
myMusicLoop.AddHandler(myMusic.Stopped, AddressOf MusicEndsLoop)

j'obtient:
Erreur 6 L'expression 'AddressOf' ne peut pas être convertie en 'System.Delegate', car le type 'System.Delegate' est déclaré 'MustInherit' et ne peut pas être créé.
Commenter la réponse de Duke49
Messages postés
553
Date d'inscription
jeudi 12 octobre 2006
Dernière intervention
6 juin 2015
0
Merci
J'ai maintenant une erreur sur:
myMusic = New Audio(fSoundMedia, True)


here:
La DLL 'C:\Windows\assembly\GAC\Microsoft.DirectX\1.0.2902.0__31bf3856ad364e35\Microsoft.DirectX.dll' tente une exécution managée dans le verrou du chargeur du système d'exploitation. N'essayez pas d'exécuter du code managé dans une fonction d'initialisation d'image ou DllMain, car cela risque d'entraîner un blocage de l'application.
Commenter la réponse de Duke49
Messages postés
553
Date d'inscription
jeudi 12 octobre 2006
Dernière intervention
6 juin 2015
0
Merci
J'en suis arrivé ici (pour info):

Imports Microsoft.DirectX
Imports Microsoft.DirectX.AudioVideoPlayback

Public Class cls_audio
#Region "CLASS MUSIC"
    Public bPLAY As Boolean = False
    Private bLOOP As Boolean = False
    Dim myMusic As Audio = Nothing

    Private Function MusicEndsLoop() As Boolean
        MusicEndsLoop = True
        While bLOOP = True
            If myMusic.Stopped = True Then
                StopMusic()
                Exit While
            End If
            System.Threading.Thread.Sleep(500)
        End While
        MusicEndsLoop = False
    End Function
    Public Sub StopMusic()
        myMusic.Stop()
        myMusic.Dispose()
        myMusic = Nothing
        bPLAY = False
        bLOOP = False
    End Sub
    Public Sub PlayMusic(ByVal fSoundMedia As String, Optional ByVal bLOOP As Boolean = False)
        If bPLAY = False Then
gtLOOP:
            myMusic = New Audio(fSoundMedia, True)
            myMusic.Play()
            bPLAY = True
            If myMusic.Playing = True Then
                If MusicEndsLoop() = True Then GoTo gtLOOP
            End If
        Else
            StopMusic()
        End If
    End Sub
#End Region
End Class
Commenter la réponse de Duke49
Messages postés
553
Date d'inscription
jeudi 12 octobre 2006
Dernière intervention
6 juin 2015
0
Merci
C'est suicidant de voir l'entre aide en .net :(
Commenter la réponse de Duke49
Messages postés
553
Date d'inscription
jeudi 12 octobre 2006
Dernière intervention
6 juin 2015
0
Merci
ou est mon renfield du vb6 :(
SNIF !
Commenter la réponse de Duke49
Messages postés
553
Date d'inscription
jeudi 12 octobre 2006
Dernière intervention
6 juin 2015
0
Merci
J'me rapproche de mon objectif !
(toujours ce méssage d'erreur de DLL LoaderLock sinon sa commence a être bon)

Imports Microsoft.DirectX

Public Class cls_audio

#Region "CLASS MUSIC"
    Public bPLAY As Boolean = False
    Friend bLOOP As Boolean = False
    Protected myMusic As Microsoft.DirectX.AudioVideoPlayback.Audio = Nothing
    Dim myThread As New System.Threading.Thread(AddressOf MusicEndsLoop)

    Private Sub MusicEndsLoop()
        While myMusic.Playing = True
            If bPLAY False And bLOOP False Then Exit While
            If myMusic.CurrentPosition = myMusic.Duration Then
                If bLOOP = True Then
                    myMusic.StopWhenReady()
                    myMusic.CurrentPosition = 0
                    myMusic.Play()
                Else
                    StopMusic()
                    Exit While
                End If
            End If
            System.Threading.Thread.Sleep(1000)
        End While
        myThread.Abort()
    End Sub

    Public Sub StopMusic()
        If myThread.IsBackground = True Then myThread.Abort()
        bPLAY = False
        bLOOP = False
        myMusic.Stop()
        myMusic.Dispose()
        myMusic = Nothing
    End Sub

    Public Sub PlayMusic(ByVal fSoundMedia As String, ByVal bSoundLoop As Boolean)
        bLOOP = bSoundLoop
        If bPLAY = False Then
            bPLAY = True
            myMusic = New Microsoft.DirectX.AudioVideoPlayback.Audio(fSoundMedia, False)
            myMusic.Play()
            myThread.Start()
        Else
            StopMusic()
        End If
    End Sub
#End Region
End Class
Commenter la réponse de Duke49
Messages postés
553
Date d'inscription
jeudi 12 octobre 2006
Dernière intervention
6 juin 2015
0
Merci
Pour désactiver le MSA j'ai la solution:
Faire ctrl+alt+E et dans Managed Debugging Assistants / et décocher LoaderLock
Commenter la réponse de Duke49
Messages postés
553
Date d'inscription
jeudi 12 octobre 2006
Dernière intervention
6 juin 2015
0
Merci
On peu faire aussi un clique dans le menu sur
Déboguer et Exceptions... ^^

J'arrive toujours pas a threader une lecture de son avec directx avec option LOOP true/false... pfffff

HELP ME !
Commenter la réponse de Duke49
Messages postés
553
Date d'inscription
jeudi 12 octobre 2006
Dernière intervention
6 juin 2015
0
Merci
JE GALERE DUR !!!
Mais j'y suis presque !!!!!!!!!!!!!!!!

Imports Microsoft.DirectX

Public Class cls_audio
    Friend Shared myThread As System.Threading.Thread
    Shared bPLAYING As Boolean = False

#Region "CLASS SOUND"
    Public Class SOUND
        <MTAThread()> _
        Shared Sub Open(ByVal fSoundMedia As String)
            If bPLAYING = False Then
                bPLAYING = True
                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.BelowNormal
                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)
            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.Play()
            While myMusic.Playing = True
                If myMusic.CurrentPosition = myMusic.Duration Then
                    If StartLoop = True Then
                        myMusic.StopWhenReady()
                        myMusic.CurrentPosition = 0
                        myMusic.Play()
                    Else
                        Exit While
                    End If
                End If
                System.Threading.Thread.Sleep(250)
            End While
            SOUND_FONCTIONS.StopMusic()
        End Sub

        Shared Sub StopMusic()
            myMusic.Stop()
            myMusic.Dispose()
            myMusic = Nothing
            If cls_audio.myThread.IsAlive = True Then cls_audio.myThread.Abort()
        End Sub
    End Class
#End Region

End Class
Commenter la réponse de Duke49
Messages postés
553
Date d'inscription
jeudi 12 octobre 2006
Dernière intervention
6 juin 2015
0
Merci
JE GALERE DUR !!!
Mais j'y suis presque !!!!!!!!!!!!!!!!

Imports Microsoft.DirectX

Public Class cls_audio
    Friend Shared myThread As System.Threading.Thread
    Shared bPLAYING As Boolean = False

#Region "CLASS SOUND"
    Public Class SOUND
        <MTAThread()> _
        Shared Sub Open(ByVal fSoundMedia As String)
            If bPLAYING = False Then
                bPLAYING = True
                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.BelowNormal
                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)
            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.Play()
            While myMusic.Playing = True
                If myMusic.CurrentPosition = myMusic.Duration Then
                    If StartLoop = True Then
                        myMusic.StopWhenReady()
                        myMusic.CurrentPosition = 0
                        myMusic.Play()
                    Else
                        Exit While
                    End If
                End If
                System.Threading.Thread.Sleep(250)
            End While
            SOUND_FONCTIONS.StopMusic()
        End Sub

        Shared Sub StopMusic()
            myMusic.Stop()
            myMusic.Dispose()
            myMusic = Nothing
            If cls_audio.myThread.IsAlive = True Then cls_audio.myThread.Abort()
        End Sub
    End Class
#End Region

End Class
Commenter la réponse de Duke49
Messages postés
553
Date d'inscription
jeudi 12 octobre 2006
Dernière intervention
6 juin 2015
0
Merci
JE GALERE DUR !!!
Mais j'y suis presque !!!!!!!!!!!!!!!!

Imports Microsoft.DirectX

Public Class cls_audio
    Friend Shared myThread As System.Threading.Thread
    Shared bPLAYING As Boolean = False

#Region "CLASS SOUND"
    Public Class SOUND
        <MTAThread()> _
        Shared Sub Open(ByVal fSoundMedia As String)
            If bPLAYING = False Then
                bPLAYING = True
                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.BelowNormal
                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)
            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.Play()
            While myMusic.Playing = True
                If myMusic.CurrentPosition = myMusic.Duration Then
                    If StartLoop = True Then
                        myMusic.StopWhenReady()
                        myMusic.CurrentPosition = 0
                        myMusic.Play()
                    Else
                        Exit While
                    End If
                End If
                System.Threading.Thread.Sleep(250)
            End While
            SOUND_FONCTIONS.StopMusic()
        End Sub

        Shared Sub StopMusic()
            myMusic.Stop()
            myMusic.Dispose()
            myMusic = Nothing
            If cls_audio.myThread.IsAlive = True Then cls_audio.myThread.Abort()
        End Sub
    End Class
#End Region

End Class
Commenter la réponse de Duke49
Messages postés
208
Date d'inscription
samedi 17 janvier 2009
Dernière intervention
5 mars 2013
0
Merci
Un commentaire d'un amateur en VB.net: BRAVO.

JLuc01
Commenter la réponse de cs_JLuc01
Messages postés
553
Date d'inscription
jeudi 12 octobre 2006
Dernière intervention
6 juin 2015
0
Merci
Merci JLuc01 sa me fait super plaisir !!!

En échange voici le code final et stable que j'ai partagé:
http://www.vbfrance.com/codes/VB8-LIRE-FICHIER-XM-AVEC-DIRECTX-DIRECTSHOW_52446.aspx
Commenter la réponse de Duke49

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.