76 votes

A quel point Android SoundPool est-il mauvais ? Quelle alternative utiliser ?

Je regardais l'Android SoundPool comme mécanisme pour implémenter des effets sonores dans ma bibliothèque générique de développement de jeux. Il s'agit de semblait idéal.

Mais un peu de recherche indique qu'il y a tous types de bogues en SoundPool . Est-ce que les insectes dans SoundPool toujours d'actualité ?

Parce que je développe une bibliothèque, tous les bogues dans SoundPool deviennent des bugs dans ma bibliothèque, et je veux isoler mes utilisateurs de cela.

Donc ma question est en gros : Quelle API dois-je utiliser pour l'audio ?

Utilisation de AudioTrack et écrire mon propre mixeur n'est pas hors de question. Mais il serait évidemment préférable d'éviter de faire cela. Et existe-t-il une API pour me fournir le décodage ?

Je dois pouvoir jouer un nombre raisonnable d'effets sonores simultanés (au moins 16, disons), et avoir encore plus d'ouverture. Les sons doivent commencer à jouer avec une faible latence. WAV doivent être pris en charge (les fichiers MP3/Ogg sont sans importance). Les effets sonores doivent prendre en charge le bouclage transparent et le réglage dynamique et individuel du volume. Le cycle de vie des applications Android doit être correctement pris en charge.

J'ai entendu dire qu'il y avait une limite de 1 Mo quelque part pour SoundPool Ceci est probablement acceptable pour chaque effet sonore individuel mais pas pour tous les tampons/sons. Quelqu'un peut-il me dire exactement quelle est la limite ?

Enfin, je dois être en mesure de diffuser de la musique de fond, dans des formats compressés, avec une faible charge CPU. Je suppose que MediaPlayer est idéal pour cela. Peut-elle être utilisée en parallèle avec une autre API ?

Je sais que quelques personnes ont utilisé MediaPlayer pour remplacer SoundPool . Mais prend-il en charge les fonctionnalités dont j'ai besoin ?

Y a-t-il d'autres API audio que j'ai manquées ?

16voto

Sparky Points 216

J'aimerais ajouter quelques commentaires plus récents sur cette question. J'utilise SoundPool depuis un certain temps dans une application avec une base d'utilisateurs assez importante pour les sons de pression de touche. Notre cas d'utilisation :

  • Doit être joué immédiatement
  • Jusqu'à 3+ sons en parallèle
  • Nous faisons appel à la setRate sur l'ensemble de sa gamme [0.5f-2.0f]

J'ai maintenant rencontré deux problèmes majeurs liés à des appareils spécifiques et j'ai décidé d'arrêter les frais et de me passer de SoundPool.

  • Un grand nombre d'appareils LG 4.4 (principalement la ligne LG G2/G3) avaient un crash natif avec leur implémentation de SoundPool. Cela a été corrigé dans une mise à jour (finalement) mais nous avons encore beaucoup d'utilisateurs avec des appareils non mis à jour.
  • Les appareils Sony Xperia ont actuellement toutes sortes de problèmes avec SoundPool comme signalés par d'autres . Dans mon cas, j'ai découvert que si l'on utilise setRate con rate > 1.0f le SoundPool commencera à lancer des exceptions jusqu'à ce que votre application s'arrête (et consommera une bonne partie de la batterie au passage).

TL;DR ; Je ne pense plus que cela vaille la peine de déboguer SoundPool.

9voto

Scott Biggs Points 958

Restez-en aux fichiers OGG et SoundPool vous conviendra parfaitement. C'est la nature même de la bête multiplateforme qu'est Android : il y aura TOUJOURS des configurations matérielles qui ne fonctionneront pas avec tous les programmes importants, quels que soient les efforts des programmeurs.

S'il s'agit d'un projet important et bien financé, ajoutez au financement un exemplaire de chaque téléphone principal pour le tester. C'est en fait beaucoup moins cher que le temps passé par les programmeurs à faire des recherches et à essayer de deviner leurs performances.

Désolé. Il semble que ce ne soit pas la réponse que vous cherchiez. Bonne chance !

3voto

Jakar Points 6267

AVERTISSEMENT : j'ai une petite expérience de MediaPlayer, et aucune expérience réussie des autres API que je mentionne, et les informations suivantes sont basées sur ce que j'ai lu dans les DOC et ce que j'ai lu dans les recherches sur Google.

Vous pourriez utiliser MediaPlayer (pour la musique de fond) avec d'autres API audio, puisque MediaPlayer fonctionne automatiquement sur son propre thread, mais je crois qu'il a une charge cpu élevée, et je ne pense pas qu'il prendrait très bien les bits compressés, mais je ne suis pas trop sûr.

Il y a aussi JetPlayer http://developer.Android.com/reference/Android/media/JetPlayer.html Ce qui semble être beaucoup de travail pour une utilisation efficace, mais cela fonctionnerait très bien avec une musique de fond, puis d'autres sons selon les besoins du jeu. D'après ce que j'ai lu dans les DOC, il faut un fichier MIDI (je crois ?) et il faut couper et rétablir le son des pistes pour que ça fonctionne comme on le souhaite.

J'aime AudioTrack parce qu'il vous donne la possibilité de modifier les sons au moment de l'exécution en changeant les fréquences du son, et SoundPool peut faire la même chose.

Cependant, dans votre situation, AudioTrack ne semble pas pouvoir fonctionner correctement, car la lecture de deux sons nécessiterait deux threads, AudioTrack étant bloquant (j'en suis presque sûr).

Et avec SoundPool, je pense que puisque vous avez 16 sons, peut-être prendre deux threads avec un SoundPool dans chaque thread et appliquer 8 sons à chaque SoundPool. Je ne sais pas vraiment, car je n'ai jamais essayé d'utiliser SoundPool.

Et encore une fois, mes informations ne sont pas basées sur l'expérience, juste sur ce qu'il semble d'après ce que j'ai lu, donc je peux me tromper complètement ou peut-être juste légèrement, ou bien, qui sait.

Et je ne sais pas vraiment quoi que ce soit sur les bugs de SoundPool, puisque je n'ai pas fait de recherches à ce sujet.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X