Quelle est la gravité de Android SoundPool? Quelle alternative utiliser?

Je regardais le SoundPool d’Android comme un mécanisme pour implémenter des effets sonores dans ma bibliothèque de développement de jeux générique. Cela semblait idéal.

Mais un peu de recherche indique qu’il y a toutes sortes de bugs dans SoundPool . Les bogues de SoundPool toujours pertinents?

Étant donné que je développe une bibliothèque, tous les bogues de SoundPool deviennent des bogues dans ma bibliothèque et je veux en isoler mes utilisateurs.

Donc, ma question est fondamentalement: quelle API dois-je utiliser pour l’audio?

Utiliser AudioTrack et écrire mon propre mixeur n’est pas exclu. Mais évidemment, il serait préférable d’éviter de le faire. Et existe-t-il une API pour me décoder?

Je dois pouvoir jouer un nombre raisonnable d’effets sonores simultanés (au moins 16, disons), et avoir encore plus ouvert. Les sons doivent commencer à jouer avec une faible latence. WAV fichiers WAV doivent être pris en charge (MP3 / Ogg est sans importance). Les effets sonores doivent prendre en charge la mise en boucle continue et le réglage dynamic du volume individuel. Le cycle de vie de l’application Android doit être correctement pris en charge.

J’ai entendu dire qu’il existe une limite de 1 Mo quelque part pour SoundPool , ce qui 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 aussi pouvoir jouer de la musique de fond dans des formats compressés, avec une faible charge de processeur. Je suppose que MediaPlayer est idéal pour cela. Peut-il être utilisé en parallèle avec une autre API?

Je sais que quelques personnes ont utilisé MediaPlayer pour remplir SoundPool . Mais supporte-t-il les fonctionnalités dont j’ai besoin?

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

Juste pour append 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 touches. Notre cas d’utilisation:

  • Doit être joué immédiatement
  • Jusqu’à 3+ sons en parallèle
  • Nous utilisons le setRate dans toute sa gamme [0.5f-2.0f]

J’ai maintenant rencontré deux problèmes spécifiques à un périphérique majeur et j’ai décidé de réduire mes pertes et de m’éloigner de SoundPool.

  • Un grand nombre de périphériques 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 (éventuellement) mais nous avons encore beaucoup d’utilisateurs avec des périphériques non mis à niveau
  • Les appareils Sony Xperia rencontrent actuellement toutes sortes de problèmes avec SoundPool, tels que rapportés par d’autres . Dans mon cas, j’ai découvert que si vous utilisez setRate avec rate > 1.0f le SoundPool avec lancer des exceptions jusqu’à ce que votre application se ferme (et graver un tas de batterie dans le processus).

TL; DR; Je ne pense plus que ça vaut le coup de déboguer SoundPool

Restez fidèle aux fichiers OGG et SoundPool vous conviendra parfaitement. C’est la nature de la bête multi-plateforme qui est Android, il y aura des configurations matérielles qui ne fonctionneront pas avec tous les programmes significatifs, peu importe avec quelle diligence les programmeurs essayent.

S’il s’agit d’un projet de grande envergure et bien financé, ajoutez à chaque financement l’un des principaux téléphones à tester. C’est en fait beaucoup moins cher que le temps passé par le programmeur à rechercher et à essayer de deviner leur performance.

Pardon. On dirait que ce n’est pas la réponse que vous cherchiez. Bonne chance!

AVERTISSEMENT: J’ai une petite expérience avec MediaPlayer, et aucune expérience réussie avec les 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 des recherches Google.

Vous pouvez utiliser mediaplayer (pour la musique de fond) avec d’autres API audio, puisque MediaPlayer s’exécute automatiquement sur son propre thread, mais je pense qu’il a une charge CPU élevée, et je ne pense pas qu’il prenne 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 qui semble fonctionner avec beaucoup de travail, mais cela fonctionnerait très bien avec la lecture de musique de fond, puis jouerait d’autres sons si nécessaire. dans le jeu. D’après ce que j’ai lu des DOC, il faut un fichier MIDI (je pense?) Et vous désactivez et réactivez les pistes pour que cela fonctionne comme vous le souhaitez.

J’aime AudioTrack car il vous permet d’éditer des sons à l’exécution en modifiant les fréquences du son, et SoundPool peut faire la même chose.

Bien que pour votre situation, AudioTrack ne semble pas fonctionner correctement, car jouer deux sons nécessiterait deux threads car AudioTrack bloque (je suis sûr).

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

Et encore une fois, mes informations ne sont pas basées sur l’expérience, mais sur ce qu’il ressort de ce que j’ai lu, donc je peux être complètement ou peut-être juste un peu faux, ou diable, qui sait.

Et je ne connais pas vraiment les bugs SoundPool, car je ne l’ai pas recherché.