Jouer un buffer son et le peupler... [Résolu]

Messages postés
16
Date d'inscription
dimanche 25 avril 2004
Dernière intervention
5 octobre 2016
- - Dernière réponse : vb95
Messages postés
1725
Date d'inscription
samedi 11 janvier 2014
Dernière intervention
11 décembre 2018
- 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
Afficher la suite 

Votre réponse

9 réponses

Messages postés
14319
Date d'inscription
vendredi 14 mars 2003
Dernière intervention
11 décembre 2018
0
Merci
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
Commenter la réponse de NHenry
Messages postés
16
Date d'inscription
dimanche 25 avril 2004
Dernière intervention
5 octobre 2016
0
Merci
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...
Commenter la réponse de Yo_Fr
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Contributeur
Dernière intervention
11 avril 2018
0
Merci
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.
Commenter la réponse de ucfoutu
Messages postés
16
Date d'inscription
dimanche 25 avril 2004
Dernière intervention
5 octobre 2016
0
Merci
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 !
Commenter la réponse de Yo_Fr
Messages postés
16
Date d'inscription
dimanche 25 avril 2004
Dernière intervention
5 octobre 2016
0
Merci
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...
Commenter la réponse de Yo_Fr
Messages postés
14319
Date d'inscription
vendredi 14 mars 2003
Dernière intervention
11 décembre 2018
0
Merci
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
Commenter la réponse de NHenry
Messages postés
16
Date d'inscription
dimanche 25 avril 2004
Dernière intervention
5 octobre 2016
0
Merci
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
Commenter la réponse de Yo_Fr
Messages postés
14319
Date d'inscription
vendredi 14 mars 2003
Dernière intervention
11 décembre 2018
0
Merci
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
Commenter la réponse de NHenry
Messages postés
16
Date d'inscription
dimanche 25 avril 2004
Dernière intervention
5 octobre 2016
0
Merci
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és
1725
Date d'inscription
samedi 11 janvier 2014
Dernière intervention
11 décembre 2018
-
Bonjour
Pour clore le sujet va voir en haut de ton post : Marquer comme Résolu
Merci
Commenter la réponse de Yo_Fr

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.