Yo_Fr
Messages postés16Date d'inscriptiondimanche 25 avril 2004StatutMembreDernière intervention 5 octobre 2016
-
27 déc. 2012 à 12:07
vb95
Messages postés3418Date d'inscriptionsamedi 11 janvier 2014StatutContributeurDernière intervention31 mai 2023
-
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
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
Yo_Fr
Messages postés16Date d'inscriptiondimanche 25 avril 2004StatutMembreDerniè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...
ucfoutu
Messages postés18038Date d'inscriptionlundi 7 décembre 2009StatutModérateurDernière intervention11 avril 2018219 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.
Yo_Fr
Messages postés16Date d'inscriptiondimanche 25 avril 2004StatutMembreDerniè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 !
Vous n’avez pas trouvé la réponse que vous recherchez ?
Yo_Fr
Messages postés16Date d'inscriptiondimanche 25 avril 2004StatutMembreDerniè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...
NHenry
Messages postés15069Date d'inscriptionvendredi 14 mars 2003StatutModérateurDernière intervention29 mai 2023158 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.
Yo_Fr
Messages postés16Date d'inscriptiondimanche 25 avril 2004StatutMembreDerniè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
NHenry
Messages postés15069Date d'inscriptionvendredi 14 mars 2003StatutModérateurDernière intervention29 mai 2023158 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
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
vb95
Messages postés3418Date d'inscriptionsamedi 11 janvier 2014StatutContributeurDernière intervention31 mai 2023165 5 oct. 2016 à 11:59
Bonjour
Pour clore le sujet va voir en haut de ton post : Marquer comme Résolu
Merci