2012-02-23 1 views
3

J'essaie d'écrire une application (je suis un premier timer gui) pour mon fils, il a l'autisme. Il y a un lecteur vidéo dans la moitié supérieure et une zone d'entrée de texte dans le bas. Lorsque les lettres sont tapées, des sons sont produits pour imiter les mots de la vidéo.sons à faible latence sur les touches presses

Il y a eu d'autres publications sur ce site en ce qui concerne la lecture des sons sur les touches, en utilisant gstreamer comme appel système. J'ai aussi essayé libcanberra mais les deux semblent avoir des retards importants entre les sons. Je peux écrire l'application en python ou en C mais j'en ferai probablement au moins une partie en C.

Je tiens également à mentionner que la partie vidéo est jouée par gstreamer. J'ai essayé de créer deux instances de gstreamer, pour éviter les appels système coûteux, mais l'instance audio semblait tuer l'application lorsqu'elle était appelée.

Si quelqu'un a des conseils pour créer des sons plus rapides, je l'apprécierais vraiment.

+0

Commentaire rapide pour répondre à une autre de vos questions qui était fermée: Les terminaux envoient et reçoivent des caractères. Normalement, les terminaux affichent simplement les caractères qu'ils reçoivent. Lorsque les terminaux étaient imprimés sur des rouleaux de papier, c'était tout ce qu'ils pouvaient faire. Les caractères spéciaux, appelés caractères de contrôle, n'étaient pas affichés: ils entraînaient plutôt le retour de l'imprimante des terminaux au début de la ligne, ou l'alimentation de papier ou le retour arrière. Les terminaux d'affichage définissent des séquences de caractères spéciales, appelées «séquences d'échappement», car elles commencent généralement par le caractère «Echap». – antlersoft

+0

Lorsqu'ils reçoivent une séquence d'échappement, les terminaux l'interprètent comme une commande pour une autre fonction, comme déplacer le curseur vers une position spécifique sur l'écran, ou changer le texte affiché dans une section de l'écran en vidéo inverse. Chaque marque de terminal définirait son propre ensemble de séquences d'échappement. – antlersoft

Répondre

4

Vous pouvez télécharger un échantillon audio brut directement à PulseAudio donc il n'y aura pas de décodage et (peut-être sauvegarder) des commutateurs supplémentaires en utilisant la fonction suivante de Canberra:

http://developer.gnome.org/libcanberra/unstable/libcanberra-canberra.html#ca-context-cache

La prochaine ca_context_play() sera utilise le. Cependant, le plus gros problème que vous rencontrerez avec ce scénario (avec une lecture vidéo simultanée) est que le périphérique audio peut être configuré avec une latence importante avec PulseAudio (jusqu'à 1/2s ou plus pour la lecture normale). Il peut être raisonnable de déposer un bogue sur libcanberra pour prendre en charge un indicateur LOW_LATENCY, car il ne tente pas actuellement de minimiser le délai pour les événements sonores afaik. Ce serait génial d'avoir. GStreamer pulsesink pourrait aussi avoir une faible latence (il a des propriétés pour ça), mais je crains que ce ne soit pas aussi léger que libcanberra, et que vous ne puissiez pas mettre en cache un sample par exemple. Idéalement, GStreamer pourrait également apprendre à mettre en cache des échantillons, ou pré-remplir PulseAudio ...

+0

Merci! Je fais un essai :) – Patrick

+1

Je veux juste mentionner quelques choses au cas où quelqu'un d'autre trébuche sur ce fil plus tard. Tout d'abord, vous pouvez avoir deux instances de gstreamer, il y avait une erreur massive dans mon code. Deuxièmement, j'ai été capable de produire les sons à faible latence en les enregistrant tous en un seul enregistrement, puis en les recherchant dans les deux sens et en mettant gstreamer en pause après chaque son. Merci encore à elmarco pour son affichage. – Patrick

Questions connexes