Jouer un buffer son et le peupler...

Résolu
Yo_Fr Messages postés 16 Date d'inscription dimanche 25 avril 2004 Statut Membre Dernière intervention 5 octobre 2016 - 27 déc. 2012 à 12:07
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 - 5 oct. 2016 à 11:59
Salut à tous,
Je suis en cours d'écriture d'un émulateur de vieux bouzin (Hector de la gamme Micronique à base de Z80). J'ai, au départ, voulu savoir si le VBNet était suffisamment rapide pour programmer ce genre de chose qui au début ne pouvait fonctionner que par du code C ou asm; mais maintenant je le sais : Ca marche !
L'ensemble de l'émulateur fonctionne (écran, clavier, K7, joystick, lecteur de disquette (à base de Z80 séparé et d'un contrôleur) ...) et seule la gestion du son est manquant. je cherche sur le net la meilleur façon de programmer le son et je ne trouve pas. Les données sont les suivantes:
* L'émulateur créé un buffer de 20ms de son. Il effectue cela durant environ 7 à 8 ms (en fait c'est le Z80 qui bosse et remplit ce buffer, comme sur la vrai machine).
* On attend une synchronisation temporelle de 20 ms (qui sera remplacée plus tard par un buffer son vide)
* On lance alors le son créé et on reboucle.
C'est tout simple MAIS : il ne faut pas de rupture entre le buffer en cours de play et le nouveau buffer de façon à éviter des "plop" toutes les 20 ms...du triple buffering devrait être suffisant (plus mettrait de la latence dans le système) : 1 buffer en calcul, 1 buffer en attente d'être joué et 1 buffer en cours de play. La synchro de 20ms actuelle serait alors réalisée par le libération du buffer en cours de play qui passe sur le suivant (à condition que chacun des buffer ai une longueur de 20ms...)

J'ai commencer à regarder NAudio et maintenant XAUDIO2 mais je ne trouve pas une réponse à ma problématique...
Je n'attend pas une solution toute programmée, mais juste une "bonne" idée pour la réalisation
(pour voir l'avance du prog actuel : googélisez "VBHector yo_fr", pour info j'avais déjà programmé dans MESS les machines Hector...en C)
JJ

9 réponses

NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
6 janv. 2013 à 02:56
Bonjour,

J'avais cherché comment faire un chat vocal, et j'étais arrivé sur cette source (je pense) :
http://www.codeproject.com/Articles/19854/Sending-and-playing-microphone-audio-over-network

Je pense qu'en reprenant la partie "jouer du son", tu aura une piste pour commencer.

v----Signature--------v----------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, celui-ci pour bien poser votre question ou encore celui-ci pour les PFE et autres exercices.[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : ).[*]En VB.NET pensez à activer Option Explicit et Option Strict (propriété du projet) et à retirer l'import automatique de l'espace de nom Microsoft.VisualBasic (onglet Références dans les propriétés du projet).[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés/list
---
Mon site
0
Yo_Fr Messages postés 16 Date d'inscription dimanche 25 avril 2004 Statut Membre Dernière intervention 5 octobre 2016
6 janv. 2013 à 18:37
Salut,
Merci de ta réponse, mais depuis j'ai trouvé la bibliothèque SFML, pas mal au demeurant, pour jouer mon son. Cette biblio permet de créer des boucles de jeu, traite des graphisme et du son. J'ai utilisé un stream son, comme dans l'exemple que tu donne. Néanmoins le plus dur est bien de synchroniser le son joué sur les hp et le son généré (l'émulation du Z80, en l’occurrence). J'ai du monter le buffer son à 200ms pour obtenir quelque chose mais le problème est de descendre cette valeur aux 20ms initiaux car cela donne trop de latence en le son entendu et l'émulation... A ce jour j'en suis à me demander si ce n'est pas là les limites du VBNet, chose que je cherchais au début de mon projet.
Merci encore et je reste de toutes façon à l'écoute de conseils, car, bien que fonctionnel, ce n'est pas encore satisfaisant...
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
6 janv. 2013 à 18:56
si ce n'est pas là les limites du VBNet, chose que je cherchais au début de mon projet

Pas de "VB.Net", mais de tout matériel informatique et de ses pilotes, tout simplement.

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
0
Yo_Fr Messages postés 16 Date d'inscription dimanche 25 avril 2004 Statut Membre Dernière intervention 5 octobre 2016
10 janv. 2013 à 03:08
oui, peut être; c'est pour cela que je continu à chercher une solution; descendre vers des buffers de 20 ms, c'est pas trop commun. Bref ma quête continue !
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Yo_Fr Messages postés 16 Date d'inscription dimanche 25 avril 2004 Statut Membre Dernière intervention 5 octobre 2016
14 janv. 2013 à 00:42
Pour info, j'ai réussi à faire fonctionner le son à l'aide de la librairie SFML, mais uniquement avec un buffer de 80ms minimum; en deçà il y a trop d'erreurs. Sachant que SFML pour générer un stream utilise 3 buffers, cela fait une latence de 240ms. On pourrait penser que c'est négligeable mais dans les jeux d'action tournant sur la machine émulée c'est beaucoup.
Si quelqu'un a une meilleur idée... mais pour l'instant je crois que je vais rester sur ce principe. Il faudrait une version en C++ pour pouvoir attaquer directX correctement; je ne pense pas de des wrapper (type charpDX) puisse atteindre des accés correctes...
0
NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
14 janv. 2013 à 09:45
Bonjour,

Je ne pense pas qu'un buffer de 20ms soit suffisant pour ne pas avoir de coupure, car de base, le temps entre 2 appels d'un processus sous Windows est de 15 à 30 ms (pour gérer les autres processus), donc descendre en dessous, il faut soit utiliser des fonctions avancées de DX, sinon, augmenter la priorité du processus, mais pas sûr que ça aille mieux.

Mon site
0
Yo_Fr Messages postés 16 Date d'inscription dimanche 25 avril 2004 Statut Membre Dernière intervention 5 octobre 2016
15 janv. 2013 à 03:52
Yop,
C'est d'expérience que tu connais ces 15/30ms ??
De mon cote j'ai réalisé cet émulateur (qui fonctionne) de la façon suivante :
Initialisation
do
  call Instruction_Z80()
  if local_tstate>maxi   'équvalent à 20ms
    'Gestion écran
    'Gestion Son
    'Gestion clavier 
    application.DoEvent()
    lsleep = glInterruptTimer - TimeGetTime()
    System.Threading.Thread.Sleep(lsleep)
  end if
loop


(évidement ce n'est que le squelette ici)

et cela fonctionne sachant qu'une instruction de Z80 prend en moyen 5 cycles (pour simplifier) et qu'il est cadencé à 5 MHz; ce Do ... loop est réalisé 1 million de fois par seconde...(en plus le lecteur de disquette étant aussi avec un Z80, j'ai donc environ 2 appel au décodage d'instruction Z80 par boucle !

Alors ok ce n'est pas un passage de processus, mais quand même c'est vachement rapide.
Le son dans la bibliothèque SFML est géré dans un autre thread, c'est peu être là que cela pêche...
JJ
0
NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
15 janv. 2013 à 18:32
Bonjour,

Oui, c'est l'expérience, même si ce que j'ai constaté date de VB6, je pense que .NET doit peut être optimiser.

v----Signature--------v----------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, celui-ci pour bien poser votre question ou encore celui-ci pour les PFE et autres exercices.[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : ).[*]En VB.NET pensez à activer Option Explicit et Option Strict (propriété du projet) et à retirer l'import automatique de l'espace de nom Microsoft.VisualBasic (onglet Références dans les propriétés du projet).[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés/list
---
Mon site
0
Yo_Fr Messages postés 16 Date d'inscription dimanche 25 avril 2004 Statut Membre Dernière intervention 5 octobre 2016
Modifié par Yo_Fr le 5/10/2016 à 10:50
Juste pour clore un peu ce sujet ouvert en 2012 il y a prêt de 4 ans...!
Maintenant l'émulateur VBHector fonctionne avec un buffer de 20ms à 176 400 Hz et c'est DirectX qui me permet de travailler (avec SharpDX en front pour le .Net). C'est avec le jeu des notification que je remplis le buffer et que je swap d'une partie de buffer à une autre.
JJ
0
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
5 oct. 2016 à 11:59
Bonjour
Pour clore le sujet va voir en haut de ton post : Marquer comme Résolu
Merci
0
Rejoignez-nous