Pas de son la première fois [Résolu]

Signaler
Messages postés
19
Date d'inscription
mercredi 23 mars 2005
Statut
Membre
Dernière intervention
8 février 2015
-
Messages postés
19
Date d'inscription
mercredi 23 mars 2005
Statut
Membre
Dernière intervention
8 février 2015
-
Bonjour à tous,
J'ai une petite appli qui joue un son genre tada.wav sur un évènement du programme.
Ce tada.wav est dans les ressources du programme.
Le programme lancé sous VB6 (création), le premier son (et les suivants) est joué sans problème en fonction de l'évènement. Si je compile le projet, le fichie *.exe ne donne pas de son au premier évènement mais OK sur les suivants.
Pour circonvenir le problème j'ai été obligé de lancer le son et de le stopper aussitôt dans le form load du projet.... mais je pense qu'il y a mieux à faire...Si quelqu'un a des idées...
Merci pour toute suggestion.

Ci-dessous le code:

Dans le form load (pour éviter le PB du premier son :
=====================================
'Play Sound and stop it to avoid false sound on 1st alarme
SND_PURGE = &H40 ' purge
PlayRESSound (101)
sndPlaySound vbNullString, SND_PURGE 'stop sound
Dans le cours du projet sur un évènement:
======================================
..........
PlayRESSound (101)
........

Dans un module .bas
=================
Public Declare Function sndPlaySound Lib "winmm.dll" Alias "sndPlaySoundA" (ByVal SounName As String, ByVal uFlags As Long) As Long
Public SoundBuffer As String

Public Sub PlayRESSound(iIndex)
On Error GoTo errhandler
SND_ASYNC = &H1 'play asynchronously
SND_MEMORY = &H4 'lpszSoundName points to a memory file
SND_NODEFAULT = &H2 'silence not default, if sound not found
SND_PURGE = &H40 ' purge

sndPlaySound vbNullString, SND_PURGE 'stop sound if préviously started

SoundBuffer = StrConv(LoadResData(iIndex, "WAV"), vbUnicode)
sndPlaySound SoundBuffer, SND_ASYNC Or SND_NODEFAULT Or SND_MEMORY
DoEvents
Exit Sub

errhandler:
tt = Err.Description
MsgBox Err.Description + ": Erreur de son.", 16, MyExeName

End Sub

10 réponses

Messages postés
19
Date d'inscription
mercredi 23 mars 2005
Statut
Membre
Dernière intervention
8 février 2015

Salut Pcpt,
J'avais essayé de passer le pointeur du tableau, plutot qu'une chaine de caractères (exactement comme dans l'exemple dont tu as donné le lien), mais j'avais exactement le même problème.
Il n'empèche que tu as vu JUSTE: ton commentaire et celui de ton exemple:
' Important : La variable doit rester vivante même après la sortie de la Sub "JoueSonMémoire"
est très pertinent, et cela a solutionné mon problème.
En effet en jouant un son en ASYNC, il est logique (possible mais pas certain, dépendant des process suivants: ce qui fait la différence entre la première fois et les suivantes), que la sortie de la subroutine qui joue le son permette à VB6, de détruire (pour la réutiliser), la mémoire utilisée pour passer le son à Winmm, qui se plante alors (soit sans jouer le son, soit en plantant l'application). En mettant le tableau à l'extérieur de la subroutine (private ou public), le problème n'existe plus dans la mesure ou un autre son ne vient pas manipuler le tableau (dans mon cas, c'est toujours le même son, et je charge maintenant le tableau une seule fois bien avant l'appel).

Un grand MERCI à toi et à Shayw
Messages postés
3258
Date d'inscription
jeudi 26 novembre 2009
Statut
Membre
Dernière intervention
3 décembre 2019
50
Salut

à quelle évenement est joué le premier son ?
c'est sync ou assync ?
Messages postés
19
Date d'inscription
mercredi 23 mars 2005
Statut
Membre
Dernière intervention
8 février 2015

Salut,
Merci pour ta réponse.
J'ai parlé d'évènement, mais ce n'est pas un évènement VB, c'est le process du programme qui décide de sonner l'alarme (le son wav).
Donc quand le prog a besoin de signaler quelque chose, il fait sonner l'alarme (le wav en async), et affiche une petite fenêtre signalant le pourquoi de l'alarme (en fait la première alarme et les suivantes sont lancées à partir du form_activate() de la petite fenêtre qui s'affiche, et qui est lancée elle par le prog principal en Modal).
Merci pour ton aide.
Messages postés
3258
Date d'inscription
jeudi 26 novembre 2009
Statut
Membre
Dernière intervention
3 décembre 2019
50
Envoies ton code
si tu copies et colles ton code utilises
la coloration syntaxique 3 iem icon à partir
de droite comme ça c'est plus facile à lire le
code
Messages postés
19
Date d'inscription
mercredi 23 mars 2005
Statut
Membre
Dernière intervention
8 février 2015

Salut ShayW,
Comme mon code est trop gros, j'ai essayé de reproduire le problème dans un petit code, mais je n'arrive pas à le reproduire, dans ce petit code. Je referai des essais plus tard, en attendant je ferai avec le palliatif dans le form load, qui fonctionne bien....
Si j'arrive à le reproduire sur un petit code, je le posterai sur ce thread...
Merci pour tout
Messages postés
3258
Date d'inscription
jeudi 26 novembre 2009
Statut
Membre
Dernière intervention
3 décembre 2019
50
Salut
un petit test si tu écris à la place de playsound
MsgBox "doit jouer tada" tu as aussi le meme
résultat
Messages postés
19
Date d'inscription
mercredi 23 mars 2005
Statut
Membre
Dernière intervention
8 février 2015

Salut ShayW,
Je viens de faire ton essai, de mettre juste après le playsound, un msgbox "Alarme", hé bien j'ai bien la msgbox, mais pas de son (la première fois)...par contre si je mets la msgbox avant le playsound, j'ai l'alarme en executant le code sous VB6 (après la msgbox), mais je ne l'ai plus avec l'exe compilé (avant ou après).
Merci pour ton aide, mais difficile de le reproduire dans un petit code.......
Messages postés
3258
Date d'inscription
jeudi 26 novembre 2009
Statut
Membre
Dernière intervention
3 décembre 2019
50
Salut

j'essaie d'analyser les résultats
peut etre envoie ton projet avec megaupload
ou un site du meme genre comme ça je pourrais le
télécharger et voir
Messages postés
19
Date d'inscription
mercredi 23 mars 2005
Statut
Membre
Dernière intervention
8 février 2015

Salut,
Il faut aussi dire que de temps en temps, j'ai winmm.dll qui me plante VB6 complètement (fermeture) et aussi l'exe compilé, avec une exception c0000...5, et ce sous XP uniquement. J'ai un autre ordi sous W7 sur lequel je fais tourner l'exe sans problème, ni de premier son ni d'exception.
J'ai essayé différents winmm.dll à différents niveaux (sous XP), toujours le même pb, je pense que c'est lié à mon pb de premier son.
Je pense avoir trouvé un autre palliatif. Pour la première alarme sonore, j'appelle l'API en "Sync", puis je le mets en "Async", et là plus de problème d'exception, ni de premier son....
Merci pour ton aide
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
39
salut,

la bizarrerie n'est pas qu'il ne fonctionne pas la première fois, mais plutôt qu'il fonctionne les autres fois

VB est un peu trop laxiste car ici tu mets la ressource dans une chaine pour la passer à la fonction qui attend un long (pointeur de tableau)

voici une méthode un peu plus... logique
comme tu peux le constater le tableau est, en plus, déclaré hors de la procédure. ce dernier point est aussi très important

++
[hr]