Modifications de Web Audio dans m36

Chris Wilson
Chris Wilson

Modifications apportées à Web Audio

Chez Google, nous aimons les normes. Notre mission est de développer la plate-forme Web définie par les normes. L'implémentation de l'API Web Audio avec le préfixe webkit (en particulier l'objet webkitAudioContext) et certains éléments obsolètes de Web Audio que nous avons continué à prendre en charge sont des points négatifs depuis un certain temps.

Il était initialement prévu que Chrome 36 supprime la prise en charge de webkitAudioContext avec préfixe, car nous avions commencé à prendre en charge l'objet AudioContext sans préfixe. Cela s'est avéré plus problématique que prévu. Chrome 36 est donc compatible avec les deux types de préfixes. Toutefois, même dans le webkitAudioContext réintroduit, plusieurs méthodes et attributs anciens, tels que createGainNode et createJavaScriptNode, ont été supprimés. En résumé, dans Chrome 36, webkitAudioContext et AudioContext sont des alias l'un de l'autre. Il n'y a aucune différence de fonctionnalité entre les deux.

Nous allons supprimer complètement la compatibilité avec le préfixe après Chrome 36, probablement dans quelques versions. Nous vous en informerons ici lorsque le changement sera imminent. Nous continuons également de contacter les auteurs pour les aider à corriger leurs applications Web Audio.

Pourquoi avons-nous fait cela plutôt que de revenir à l'implémentation précédente ? En partie, nous avons été réticents à revenir trop en arrière. Nous avons déjà supprimé ces API. En tant qu'effet secondaire intéressant de cet aliasage, les applications peuvent alors fonctionner correctement sur Firefox, qui n'a jamais accepté d'objet AudioContext préfixé (et c'est tout à fait normal !) dans sa prise en charge de Web Audio, initialement publiée à l'automne dernier.

Le reste de cette mise à jour vous explique comment corriger les problèmes pouvant survenir dans votre code en raison de ce changement. L'avantage de résoudre ces problèmes est que votre code fonctionnera probablement aussi dans Firefox. (J'ai longtemps pensé que mon application Vocoder était défectueuse en raison de l'implémentation de Firefox, mais il s'est avéré que c'était l'un de ces problèmes.)

Si vous souhaitez simplement vous lancer, vous pouvez consulter une bibliothèque de patchs que j'ai écrite pour les applications écrites avec l'ancien code Web Audio. Cela peut vous aider à vous lancer en un minimum de temps, car elle associera les objets et les méthodes de manière appropriée. En effet, les correctifs listés par la bibliothèque sont un bon guide des éléments qui ont changé.

Avant tout

Toutes les références à window.webkitAudioContext doivent être remplacées par window.AudioContext. Ce problème a souvent été résolu en effectuant les opérations suivantes:

window.AudioContext = window.AudioContext || window.webkitAudioContext;

Si votre application répond par une phrase telle que "Malheureusement, votre navigateur n'est pas compatible avec Web Audio. Veuillez utiliser Chrome ou Safari." Il est fort probable qu'il recherche explicitement webkitAudioContext. Mauvais développeur ! Vous avez peut-être déjà aidé Firefox pendant des mois !

Cependant, il existe d'autres suppressions de code plus subtiles, dont certaines peuvent être moins évidentes.

  • Les constantes de type énuméré BiquadFilter pour l'attribut .type (qui est désormais une chaîne) n'apparaissent plus sur l'objet BiquadFilterNode, et nous ne les acceptons pas pour l'attribut .type. Vous n'utilisez donc plus .LOWPASS (ou 0) et vous le définissez sur "lowpass".
  • De même, l'attribut Oscillator.type est désormais un type énuméré de chaîne, et non plus .SAWTOOTH.
  • PannerNode.type est désormais également un type énuméré de chaîne.
  • PannerNode.distanceModel est désormais également un type énuméré de chaîne.
  • createGainNode a été renommé createGain.
  • createDelayNode a été renommé createDelay.
  • createJavaScriptNode a été renommé createScriptProcessor.
  • AudioBufferSourceNode.noteOn() est désormais remplacé par start()
  • AudioBufferSourceNode.noteGrainOn() est également remplacé par start().
  • AudioBufferSourceNode.noteOff() a été renommé stop().
  • OscillatorNode.noteOn() a été renommé start().
  • OscillatorNode.noteOff() a été renommé stop().
  • AudioParam.setTargetValueAtTime() a été renommé setTargetAtTime().
  • AudioContext.createWaveTable() et OscillatorNode.setWaveTable() sont désormais renommés createPeriodicWave() andsetPeriodicWave()`.
  • AudioBufferSourceNode.looping a été supprimé et remplacé par .loop
  • AudioContext.createBuffer(ArrayBuffer, boolean) pour décoder de manière synchrone un blob de données audio encodées a été supprimé. Les appels synchrones qui prennent beaucoup de temps sont une mauvaise pratique de codage. Utilisez plutôt l'appel asynchrone decodeAudioData. Il s'agit de l'une des modifications les plus difficiles, car vous devez modifier le flux logique, mais c'est une pratique bien meilleure. Ehsan Angkari, de Mozilla, a fourni un exemple de conversion dans son article sur la conversion vers Web Audio standard.

Beaucoup d'entre eux (comme le renommage de createGainNode et la suppression du décodage synchrone dans createBuffer) s'afficheront évidemment dans la console des outils pour les développeurs en tant qu'erreur. Toutefois, d'autres, comme cette utilisation:

MULTI_LINE_CODE_PLACEHOLDER_1

ne s'affichera pas du tout et échouera de manière silencieuse (myFilterNode.BANDPASS sera désormais défini sur "undefined", et la tentative de définir .type sur "undefined" n'aura aucun effet. C'est d'ailleurs ce qui causait l'échec du vocoder.) De même, il suffisait d'attribuer le type de filtre à un nombre pour que cela fonctionne:

myFilterNode.type = 2;

Vous devez maintenant utiliser l'énumération de chaînes:

myFilterNode.type = bandpass;

Vous pouvez donc rechercher les termes suivants dans votre code:

  • webkitAudioContext
  • .LOWPASS
  • .HIGHPASS
  • .BANDPASS
  • .LOWSHELF
  • .HIGHSHELF
  • .PEAKING
  • .NOTCH
  • .ALLPASS
  • .SINE
  • .SQUARE
  • .SAWTOOTH
  • .TRIANGLE
  • .noteOn
  • .noteGrainOn
  • .noteOff
  • .setWaveTable
  • .createWaveTable
  • .looping
  • .EQUALPOWER
  • .HRTF
  • .LINEAR
  • .INVERSE
  • .EXPONENTIAL
  • createGainNode
  • createDelayNode
  • .type (oui, cela entraînera de nombreux faux positifs, mais c'est le seul moyen de détecter le dernier exemple ci-dessus)

Encore une fois, si vous êtes pressé et que vous souhaitez vous lancer, il vous suffit de récupérer une copie de ma bibliothèque webkitAudioContext monkeypatch et de l'inclure dans votre application. Bon développement audio !