Page 1 sur 2
Adresse memoire d'un son
Publié : lun. 28/mai/2007 21:32
par barnierchristophe
Hello
L'un d'entre vous connaîtrait-il le moyen de récupérer l'adresse ou est chargée un son en mémoire? . J'utilise simultanément le même son et j'aimerais ne pas avoir à le charger depuis un fichier ( c'est long au démarrage) ni en ressource (c'est long à la compilation...) à chaque fois que je l'utilise, Je voulais passé par catchsound, mais je ne sait pas comment lui fournir l'adresse de l'échantillon.
Publié : lun. 28/mai/2007 22:02
par Backup
.....
Publié : lun. 28/mai/2007 22:30
par minirop
dobro > "Avec les fichiers WAV, le paramètre 'Longueur' n'a pas besoin d'être spécifié."

Publié : lun. 28/mai/2007 22:54
par Backup
minirop a écrit :dobro > "Avec les fichiers WAV, le paramètre 'Longueur' n'a pas besoin d'être spécifié."

oui ! je sais , mais puisqu'il sert pour d'autre formats, et qu'il ne gene pas pour celui-ci, et que ma reponse s'adresse a quelqu'un qui nage dans le potage (:lol: ) , j'ai preferé etre le plus scolaire possible !

Publié : lun. 28/mai/2007 23:15
par Anonyme
le pointeur est toujours le meme lors du chargement du meme son (testé sous nunux) :
(avec debugger)
Code : Tout sélectionner
If InitSound() = 0
MessageRequester("Error", "Can't open SDL Or no sound card is available", 0)
End
EndIf
SoundFileName$ = OpenFileRequester("Choose a .wav file", "/usr/share/sounds/", "Wave files|*.wav",0)
If SoundFileName$
For i = 0 To 5
*Ptr = LoadSound(0, SoundFileName$)
Debug *ptr
Next
PlaySound(0)
MessageRequester("Sound", "Playing the sound..."+Chr(10)+"Click to quit..", 0)
Else
MessageRequester("Error", "Can't load the sound.", 0)
EndIf
End
Publié : lun. 28/mai/2007 23:42
par barnierchristophe
Vous battez pas, du potage, y'en aura pour tous le monde....
le coup de la data section est surement le bon, Mais ça ne donne toujours pas l'adresse de stockage...
Et puis j'ai un Out Of Memory....
En tout cas merci.. Ciao
Publié : mar. 29/mai/2007 0:42
par KarLKoX
Les réponses données répondent à ta question (je préfere la méthode de Cpl.Bator) ou alors essaye d'être plus clair stp.
J'espère que tu ne fais pas un bête copier/coller ...
Publié : mar. 29/mai/2007 1:35
par barnierchristophe
J'ai pas l'impression d'avoir eu ma réponse..
voilà plus de détail:
J'ai plusieurs sprites,de même type, qui fond le même bruit, dont je ne connais pas le nombre par avance (Linkedlist). Je veux qu'ils le fasses simultanément; Il faut donc que j'ai un son par sprite;
1ere méthode:
loadsound(#SonSpriteN°x,"fichier")
-->c'est trop long.
2eme methode:
catchsound(#SonSpriteN°x,?label)
et includebinary-->idem, çà fait tousser l'executable
3ème méthode:
*ptr=loadsound(#SonSprite,"fichier")
catchsound(#SonSpriteN°x,*ptr)
-->ça marche pas...Je n'ai pas l'impression que loadsound renvoie l'adresse de l'echantillon..
c'est donc pour ça que je voulais savoir si il y avait moyen de connaitre l'adresse d'un échantillon qui a été chargé en mémoire..
Publié : mar. 29/mai/2007 6:46
par Backup
barnierchristophe a écrit :
le coup de la data section est surement le bon, Mais ça ne donne toujours pas l'adresse de stockage...
Et puis j'ai un Out Of Memory....
En tout cas merci.. Ciao

pas de out memory avec mon exemple puisque justement il est dans une datasection !! , revoie ton prg a mon avis ...
mon exemple fonctionne tres bien !
en plus l'adresse du debut de l'echantillon tu l'as !!
avec :
?a
tout mon synthetiseur vocal repose sur ce principe !! et des sons j'en gere
(pour info :1466 sons !!) !

Publié : mar. 29/mai/2007 10:09
par Anonyme
je ne te comprends pas, des jeux, j'en ai fait, regarde se snippet :
Code : Tout sélectionner
OpenConsole() : EnableGraphicalConsole(1)
Debug "la console ne marche po sous linux..."
Enumeration
#Son_Test
EndEnumeration
InitSound()
LoadSound(#Son_Test,"/usr/share/sounds/generic.wav")
Structure MesSprites
PositionX.f
PositionY.f
*Sprite_ptr.l
SND_test.l
EndStructure
Global NewList Sprites.MesSprites()
For i = 0 To 100
AddElement(sprites())
With Sprites()
\PositionX = Random(1000)
\PositionY = Random(1000)
\Sprite_ptr = 0 ; Pointeur d'un sprite
\SND_test = #Son_Test
EndWith
Next i
Repeat
If T<ElapsedMilliseconds()
T=ElapsedMilliseconds()+500
SelectElement(sprites(),Random(100))
PlaySound(sprites()\SND_test)
Debug "Je joue le son du sprite n°"+Str(ListIndex(sprites()))
Debug "le son est chargé qu'une fois..."
EndIf
ForEver
Publié : mar. 29/mai/2007 12:46
par barnierchristophe
pour dobro:
c'est pour un petit jeu donc plus temps reel que ton application. Si je charge tous les sons au debut du programme, j'ai un out of memory. D'autre part, qu'en je crée un Sprite, je dois chargé le son au moment de la création, et le catchsound est assez long...
pour Cpl Bator:
Peux-tu m'assurer que le son de deux sprites peuvent-être joué simultanément?? J'ai l'impression que comme ils ont le même identifiant, le son joué est arreté quand l'autre est lancé. Exemple: si tu fais deux explosions successives, est-ce que tu entends la fin de la première explosion quand tu envoie la seconde???
Publié : mar. 29/mai/2007 13:22
par Anonyme
SoundFrequency(#Son_test,44000,PlaySound(sprites()\SND_test))
logiquement sa marche.
ps: sous nux, sa marche pas la fréquence...
Publié : mar. 29/mai/2007 17:27
par barnierchristophe
pour Cpl.bator
J'ai vérifié avec un son long et c'est bien ce que je pensais; quand tu envoies le son d'un sprite, le son du sprite précedent est arrêté. C'est bien normal car ils ont tous le même identifiant. Donc, pas de polyphonie. Pour s'en persuader, Il suffit de charger cinq fois le même fichier, avec donc des identifiants et des adresses différentes, et là, on à une polyphonie:
Code : Tout sélectionner
OpenConsole() : EnableGraphicalConsole(1)
Debug "la console ne marche po sous linux..."
Enumeration
#Son_Test
EndEnumeration
InitSound()
Structure MesSprites
PositionX.f
PositionY.f
*Sprite_ptr.l
SND_test.l
EndStructure
Global NewList Sprites.MesSprites()
For i = 0 To 5
AddElement(sprites())
With Sprites()
\PositionX = Random(1000)
\PositionY = Random(1000)
\Sprite_ptr = 0 ; Pointeur d'un sprite
\SND_test=LoadSound(#PB_Any,"/usr/share/sounds/generic.wav")
EndWith
Next i
Repeat
If T<ElapsedMilliseconds()
T=ElapsedMilliseconds()+500
SelectElement(sprites(),Random(5))
PlaySound(sprites()\SND_test)
Debug "Je joue le son du sprite n°"+Str(ListIndex(sprites()))
Debug "le son est chargé 5 fois..."
EndIf
ForEver
c'est effectivement pas du tout le même son au final
La seul solution que je vois, c'est donc de charger le son plusieurs fois dans une LinkedList, et faire en sorte que chaque sprite affiché prenne l'identifiant suivant dans la liste.
Publié : mar. 29/mai/2007 19:14
par Anonyme
pour Cpl.bator
J'ai vérifié avec un son long et c'est bien ce que je pensais; quand tu envoies le son d'un sprite, le son du sprite précedent est arrêté. C'est bien normal car ils ont tous le même identifiant. Donc, pas de polyphonie. Pour s'en persuader, Il suffit de charger cinq fois le même fichier, avec donc des identifiants et des adresses différentes, et là, on à une polyphonie:
non, l'histoire d'identifiant n'a rien a voir, ca m'est sorti de la tete mais en faisant playsound(MonSon,2) sa marche. c'est pas spécifié dans la doc...
@++
Publié : mar. 29/mai/2007 20:32
par barnierchristophe
Impeccable, c'est ce que je cherchais. A quoi correspond ce paramètre?
En tout cas merci beaucoup. Ciao