web-dev-qa-db-fra.com

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

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

Mais un peu de recherche indique qu'il y a toussortessurbugs dans SoundPool. Les bogues de SoundPool sont-ils toujours pertinents?

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

Donc ma question est essentiellement: quelle API dois-je utiliser pour l'audio?

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

J'ai besoin de pouvoir jouer un nombre raisonnable d'effets sonores simultanés (au moins 16, disons), et en avoir encore plus d'ouverture. Les sons doivent commencer à jouer avec une faible latence. WAV les fichiers doivent être pris en charge (MP3/Ogg est sans importance). Les effets sonores doivent prendre en charge une boucle transparente et un ajustement dynamique et individuel du volume. Le cycle de vie de l'application Android Android doit être correctement pris en charge.

J'ai entendu dire qu'il y a une limite de 1 Mo quelque part pour SoundPool, c'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 également pouvoir jouer 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-il être utilisé en parallèle avec une autre API?

Je sais que quelques personnes utilisent 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?

73
Andrew Russell

Juste pour ajouter quelques commentaires plus récents sur ce problème. 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 sur toute sa plage [0.5f-2.0f]

J'ai maintenant rencontré deux problèmes spécifiques à un appareil majeur et j'ai décidé de réduire mes pertes et de quitter SoundPool

  • Un grand nombre de 4,4 LG (principalement la ligne LG G2/G3) ont eu un crash natif avec leur implémentation de SoundPool. Cela a été corrigé dans un mettre à jour (éventuellement) mais nous avons encore beaucoup d'utilisateurs avec des appareils non mis à niveau
  • Les appareils Sony Xperia ont actuellement toutes sortes de problèmes avec SoundPool comme rapporté par d'autres . Dans mon cas, j'ai découvert que si vous utilisez setRate avec rate > 1.0f le SoundPool avec commencer à lever des exceptions jusqu'à ce que votre application se ferme (et graver à travers un tas de batterie dans le processus).

TL; DR; Je ne pense plus que ça vaut le danger/les tracas du débogage de SoundPool

15
Sparky

Restez avec les fichiers OGG et SoundPool vous fera très bien. C'est la nature de la bête multiplateforme qui est Android qu'il y aura des configurations matérielles qui ne fonctionneront pas avec tous les programmes importants, quelle que soit la diligence des programmeurs.

S'il s'agit d'un projet important et bien financé, ajoutez au financement un de chaque téléphone majeur pour les tests. C'est en fait beaucoup moins cher que le temps passé par le programmeur à rechercher et à essayer de deviner quelles sont leurs performances.

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

9
Scott Biggs

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 à partir des recherches google.

Vous pouvez utiliser mediaplayer (pour la musique de fond) avec d'autres API audio, car MediaPlayer s'exécute automatiquement sur son propre thread, mais je pense qu'il a une charge de processeur élevée, et je ne pense pas que cela 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 qui semble beaucoup de travail à utiliser efficacement, mais cela fonctionnerait très bien avec la lecture de musique de fond , puis jouer d'autres sons selon les besoins du jeu. D'après ce que j'ai lu des DOC, il faut un 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 donne la possibilité d'éditer des sons lors de l'exécution en changeant les fréquences du son, et SoundPool peut faire de même.

Bien que pour votre situation, AudioTrack ne semble pas fonctionner correctement, car la lecture de deux sons nécessiterait deux threads car AudioTrack est bloquant (je 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 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, juste ce qu'elles apparaissent à partir de ce que j'ai lu, donc je peux être complètement ou peut-être légèrement faux, ou diable, qui sait.

Et je ne sais vraiment rien sur les bugs SoundPool, car je ne l'ai pas recherché.

3
Reed