2016-09-06 2 views
0

J'ai un scénario où j'ai quelques données de synchronisation que je reçois d'un fichier MIDI. Quand une note MIDI doit être jouée, j'ai besoin d'envoyer une commande sur UDP. Fondamentalement, j'ai des instructions qui disent "jouer note A, attendre 125ms, jouer note B, attendre 300ms, jouer note C ..." et chaque fois que je "jouer note X" j'ai besoin d'envoyer des données sur UDP. J'ai essayé d'utiliser à la fois un TimerTask et un simple thread avec une boucle qui vérifie l'heure du système et calcule combien de temps s'est écoulé et décide de jouer ou non une note basée sur cela, mais les deux méthodes semblent avoir des problèmes de timing. La TimerTask ne s'exécute pas exactement sur l'intervalle spécifié (indiqué dans la documentation), donc je reçois des messages erratiques. Le thread fonctionne mieux, mais il continue parfois de hocher ce que je suppose parce que les autres threads ont la priorité sur lui.Comment envoyer des données avec un timing précis dans l'application Android?

Y a-t-il un meilleur moyen d'envoyer ces données avec un timing plus précis? Y at-il quelque chose que je peux utiliser comme l'interface Clip en Java qui est utilisée pour jouer de l'audio?

Toute aide est très appréciée.

Répondre

0

C'est une approche à peu près vouée à l'échec. Laissez-moi compter les problèmes ici:

1) Android n'est pas un système d'exploitation en temps réel. Linux non plus (sur lequel il est construit). Attendre que les timings de niveau ms se produisent correctement ne fonctionnera jamais. Même si l'horloge est assez précise pour interrompre à un rythme de 1ms, rien ne garantit que Linux planifie votre thread pour le réveil.

2) TimerTask ne sont pas promis d'être précis, même au degré limité par 1.

3) Vous êtes alors l'envoyer quelque part via UDP? Un protocole qui n'a aucune garantie quant à la livraison ou au calendrier, à un destinataire qui fera ensuite quelque chose avec lui - et ce récepteur peut avoir d'autres problèmes de synchronisation. Jeter toute cette approche et recommencer serait mon conseil. Chaque étape de ce dit une mauvaise idée.

+0

Alors, comment une application qui lit l'audio garde-t-elle le bon temps? Lorsqu'une application Android lit une chanson à partir d'un fichier, elle ne présente pas ce type de problème. Je ne dis pas que vous n'êtes pas correct ci-dessus, je veux juste savoir comment la lecture audio est accomplie malgré les problèmes que vous avez mentionnés – jteezy14

+0

Pas par des données de synchronisation. Il écrit les données du fichier en mémoire. Ensuite, il indique à la carte son où se trouvent les données, et la carte son lit la mémoire et gère la sortie. C'est une simplification bien sûr (la réponse complète implique des choses comme le DMA et le recyclage des tampons), mais pour jouer de la musique, il la transmet à un autre morceau de matériel. –