Aie,
Je reviens à la charge parce que j'ai besoin d'info : Comment fonctionne le stream ?
J'ai créé mon programme de son dans mon émulateur et cela est loin d'être suffisant car j'ai beaucoup de mélange de son. Pour y voir plus clair, j'ai créé un exemple qui ne devrait que marcher et qui bug un peu et je n'arrive pas à voir pourquoi. Voici mon exemple :
J'ai créé une class toute bête de hérité de sound stream,
Public Class HectorStream
Inherits SFML.Audio.SoundStream
'////////////////////////////////////////////////////////////
'/// Constructor
'////////////////////////////////////////////////////////////
Dim BufferSize As Integer
Dim myBuffer(1) As Short ' (A redimentionner dynamiquement)
Public Flag As Boolean = False ' Indique que le gestionnaire de son a demandé des données
Dim SampleRateH As Integer
Sub New(ByVal BufferSize_ As Integer, ByVal SampleRate_ As Integer)
BufferSize = BufferSize_ - 1 ' (à partir de 0 sur la longueur demandée)
ReDim myBuffer(BufferSize)
SampleRateH = SampleRate_
End Sub
Protected Overrides Function OnStart() As Boolean
OnStart = True
End Function
' Protected Overrides Sub onSeek(ByVal Time As System.TimeSpan)
' ' onseek = False
' End Sub
Protected Overrides Function OnGetData(ByRef Data() As Short) As Boolean
'Remplissage du stream
Data = myBuffer
Flag = True
OnGetData = True
End Function
Sub AddSample(ByRef Donnee() As Short)
' Récupération du buffer calculé
myBuffer = Donnee.Clone
End Sub
Public Sub SomeInitFunction()
Dim ChannelsCount As Integer = 1
' init SoundStream.
Initialize(ChannelsCount, SampleRateH)
End Sub
End Class
et je l'initialise avec des données simple :
Son = New HectorStream(LG_Sample, SampleRate)
Avec LG_Sample = 882*2 (2 buffer de 20ms) en 44100Hz de SampleRate
Ensuite je créé deux buffers pour avoir 2 notes :
Dim buffe
(LG_Sample
- 1) As Short Dim buffe2
(LG_Sample
- 1) As Short Dim Freq
As Double Freq
= (2 * Math
.PI * 1000 / SampleRate
) 'Initialisation du buffer avec un sin For i
= 0 To LG_Sample
- 1 buffe
(i
) = Math
.Sin(i
* Freq
) * 32700 buffe2
(i
) = Math
.Sin(i
* Freq
* 1.5) * 32700 Next Quelques init encore :
' Initialisation
Son.SomeInitFunction()
Son.Loop = False
Son.Volume = 100.0
'On lance le play
Son.Play()
Son.Flag = False
Et enfin on lance le son :
' Remplissage des buffers
For i = 1 To 10
Do Until Son.Flag
Application.DoEvents()
Loop
Son.Flag = False
If (i Mod 2) = 0 Then
Son.AddSample(buffe)
Else
Son.AddSample(buffe2)
End If
Next i
Puis pour finir, j'arrête le son (en fait je vide le buffer de la class pour que le son ensuite joué soit nul):
For i = 0 To LG_Sample - 1
buffe(i) = 0 ' Math.Sin(i * Freq * 0.5) * 32700
Next
Do Until Son.Flag
Application.DoEvents()
Loop
Son.AddSample(buffe)
Son.Flag = False
Roulement de tambour.... Cela devrait donner
1764 échantillon d'une note et 1764 échantillon de l'autre note, et cela 5 fois !
Evidement ce n'est pas ce que j'ai !
Voici le son obtenu :
* 1764 échantillons note 1 (correct)
* 4000 échantillons à 0 (?)
* 1764 échantillons note 1 (correct)
* 1764 échantillons note 2 (correct)
* 3528 échantillons note 1 (?)
* 1764 échantillons note 2 (correct)
* 1764 échantillons note 1 (correct)
* 1764 échantillons note 2 (correct)
* 3528 échantillons note 1 (?)
* 1764 échantillons note 2 (correct)
* 1764 échantillons note 1 (correct)
* 1764 échantillons note 2 (correct)
* 3528 échantillons note 1 (?)
* 1764 échantillons note 2 (correct)
* 1764 échantillons note 1 (correct)
* 1764 échantillons note 2 (correct)
* 3528 échantillons note 1 (?)
* 1764 échantillons note 2 (correct)
* 1764 échantillons note 1 (correct)
* 3528 échantillons à 0
* 1764 échantillons note 1 (?)
Bref le son est extrêmement mélangé, contrairement à notre attente :10 * (note 1, note 2) de 1764 échantillons chacun...)
Je me pose donc pas mal de question :
* Pourquoi j'ai une erreur au début avec un trou de 4000 échantillons ? (on est loin de 3528 qui pourrait se comprendre)
* pourquoi la note 1 est assez souvent jouée 2* ? (1 fois sur 2 pour être précis)
* Pourquoi l'arrêt ne se fait il pas de manière brute ?
L'un des réponse pourrait se trouver dans les mélanges de threads. Néanmoins je ne pense pas, les actions étant immédiates, suite à la détection de consommation du buffer (via le set du Flag) le nouveau buffer et réactualiser pour attendre 20*2ms... Cela devrait laisser le temps à tout le monde d'y arriver.
Méthode de test :
1) Pour info j'enregistre avec GoldWave le son produit par l'ordinateur avec un taux d'échantillonnage de 44100Hz, ensuite il suffit de compter les samples d'une fréquence ou d'une autre.
2) Le programme de test est tel que reproduit ici. Il est inclus dans mon programme global d'émulation, mais je ne lance aucun autre thread ou calcul lors de ces essais.
Merci d'avoir tout lu ! et la raison qui fait que je me trompe serait un plus !!!
Merci d'avance,
Jean-Jacques