Lorsqu'un utilisateur clique sur un bouton, un son est joué, et s'il clique à nouveau, une nouvelle instance de ce même son est jouée.

Je le fais en connectant un nouveau nœud source au contexte audio à chaque clic.

Disons maintenant que l'utilisateur clique sur le bouton pendant 1 heure, est-ce que chaque nœud source qui a fini de jouer est supprimé ou reste connecté au contexte audio ?

1
soufiane yakoubi 17 mars 2019 à 17:05

2 réponses

Meilleure réponse

Voici les spécifications pertinentes :

Les comportements suivants fournissent une description normative des conditions dans lesquelles un AudioNode est vivant, ce qui signifie qu'il DOIT être conservé dans le graphe par une implémentation. Lorsque ces conditions ne s'appliquent pas, les AudioNodes PEUVENT être libérés par une implémentation.

Il existe plusieurs types de références :

  1. Une référence normale obéissant aux règles normales de ramasse-miettes.

  2. Une référence de lecture pour AudioBufferSourceNodes, MediaElementAudioSourceNodes, MediaStreamAudioSourceNodes et OscillatorNodes. Ces nœuds conservent une référence de jeu à eux-mêmes pendant qu'ils jouent actuellement.

  3. Une référence de connexion qui se produit si un autre AudioNode est connecté à une ou plusieurs de ses entrées. Les connexions aux AudioParams d'un nœud n'impliquent pas une référence de connexion.

  4. Une référence de temps de fin qu'un AudioNode conserve sur lui-même tant qu'il a un état de traitement interne qui n'a pas encore été émis. Par exemple, un ConvolverNode a une queue qui continue à jouer même après avoir reçu une entrée silencieuse (pensez à taper dans vos mains dans une grande salle de concert et à continuer d'entendre le son se répercuter dans toute la salle). Certains AudioNodes ont cette propriété. Veuillez consulter les détails pour des nœuds spécifiques.

  5. Les MediaStreams maintiennent un MediaStreamAudioSourceNode en vie tant que le MediaStreamTrack sous-jacent qui est lu via le MediaStreamAudioSourceNode n'est pas terminé (conformément à [mediacapture-streams]).

  6. Les HTMLMediaElements gardent leur MediaElementAudioSourceNode associé en vie tant que le HTMLMediaElement est dans un état où l'audio pourrait un jour être lu à l'avenir.

Ainsi, dans le cas par exemple, un AudioBufferSourceNode, puisqu'il n'a pas d'entrée(3), pas de tail-time(4), n'est pas lié à un MediaStream externe( 5) ou MediaElement(6), si vous ne gardez aucune référence au nœud dans votre code js(1), et que le nœud a fini de jouer(2), alors il peut être supprimé du graphe, puis Garbage Recueilli.


Notez également que la plupart des nœuds source ont de toute façon très peu d'empreintes digitales.

Si encore une fois nous prenons AudioBufferSourceNodes comme exemple, alors vous devez comprendre qu'ils ne dupliquent pas le AudioBuffer, ils le référencent simplement.
Ainsi, créer des milliers de AudioBufferSourceNodes à partir du même AudioBuffer est très bien.

Cependant, créer des milliers de AudioBuffers à partir du même ArrayBuffer, ou des milliers de ArrayBuffers à partir du même fichier, ou les deux n'est pas du tout bien, alors soyez Assurez-vous que lorsque vous gérez l'événement click, tout ce que vous faites est de créer un nouveau AudioBufferSourceNode, à partir d'un AudioBuffer préexistant.

3
Community 20 juin 2020 à 09:12

Le BufferSourceNode ne sera pas supprimé s'il est toujours connecté au contexte audio. Vous pouvez le vérifier en utilisant les outils de développement Firefox Web Audio ou en installant l'extension Audion Chrome.

Vous pouvez ajouter une fonction onended au BufferSourceNode pour le déconnecter après son utilisation. Ensuite, tant que rien d'autre n'a de référence à ce nœud source de tampon, il sera nettoyé par le ramasse-miettes.

Source : https://developer.mozilla.org/en- US/docs/Web/API/AudioScheduledSourceNode/onended

0
Anonymous 20 mars 2019 à 04:47