Modifiche all'audio web in m36

Andrea Rossi
Chris Wilson

Modifiche all'audio web

Noi di Google amiamo gli standard. La nostra missione è realizzare la piattaforma web basata sugli standard. Una delle piccole verruche da tempo è stata l'implementazione con prefisso webkit-Audio dell'API Web Audio (in particolare l'oggetto webkitAudioContext) e alcuni dei bit deprecati di Web Audio che abbiamo continuato a supportare.

Inizialmente era previsto che Chrome 36 rimuovesse il supporto per il prefisso webkitAudioContext, poiché avevamo iniziato a supportare l'oggetto AudioContext senza prefisso. Questo si è rivelato più problematico del previsto, quindi Chrome 36 supporta sia senza prefisso che con prefisso. Tuttavia, anche nel webkitAudioContext reintrodotto, sono stati rimossi diversi metodi e attributi precedenti come createGainNode e createJavaScriptNode. In breve, in Chrome 36 webkitAudioContext e AudioContext sono alias l'uno dell'altro; non esiste alcuna differenza di funzionalità tra i due.

Rimuoveremo completamente il supporto per il prefisso dopo Chrome 36, probabilmente in un paio di release. Faremo un annuncio qui quando il cambiamento sarà imminente e continueremo a contattare gli autori per risolvere i problemi delle loro applicazioni Web Audio.

Perché lo abbiamo fatto anziché tornare all'implementazione precedente? In parte, siamo stati reticenti a fare un passo indietro; abbiamo già rimosso queste API e, come grazioso effetto collaterale a questo aliasing, le applicazioni potranno funzionare bene su Firefox, che non ha mai supportato un oggetto AudioContext con prefisso (e altrettanto corretto!) nel loro supporto Web Audio inizialmente rilasciato lo scorso autunno.

Il resto di questo aggiornamento fornisce una guida per correggere gli elementi che potrebbero non funzionare nel codice a causa di questa modifica. L'aspetto fantastico della risoluzione di questi problemi è che molto probabilmente il codice funziona anche in Firefox. (Pensavo a lungo che la mia applicazione Vocoder si fosse interrotta a causa dell'implementazione di Firefox, ma si è rivelato uno di questi problemi).

Se desideri essere subito operativo, puoi dare un'occhiata a una monkey-patch libreria che ho scritto per le applicazioni scritte con il vecchio codice audio web. Questo può aiutarti a essere attivo e funzionante nel minor tempo possibile. In effetti, le patch elencate nella libreria sono una buona guida ai cambiamenti.

Innanzitutto

Qualsiasi riferimento a window.webkitAudioContext deve invece essere effettuato a window.AudioContext. Spesso questo problema è stato risolto con una semplice procedura:

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

Se la tua app risponde con qualcosa del tipo "Purtroppo il browser non supporta Web Audio. Usa Chrome o Safari." È molto probabile che stia cercando esplicitamente webkitAudioContext. Cattivo sviluppatore! È possibile che tu abbia supportato Firefox da mesi!

Tuttavia, ci sono altre rimozioni di codice più sottili, alcune delle quali possono essere meno scontate.

  • Le costanti di tipo enumerate di BiquadFilter per l'attributo .type (che ora è una stringa) non vengono più visualizzate nell'oggetto BiquadFilterNode e non sono supportate nell'attributo .type. Quindi non usi più .LOWPASS (o 0). Impostalo su "lowpass".
  • Analogamente, anche l'attributo Oscillator.type è un tipo enumerato di stringa, non più .SAWTOOTH.
  • Anche PannerNode.type è ora un tipo di stringa enumerato.
  • Anche PannerNode.distanceModel è ora un tipo di stringa enumerato.
  • createGainNode è stato rinominato in createGain
  • createDelayNode è stato rinominato in createDelay
  • createJavaScriptNode è stato rinominato in createScriptProcessor
  • AudioBufferSourceNode.noteOn() è ora sostituito da start()
  • Anche AudioBufferSourceNode.noteGrainOn() è ora sostituito da start()
  • Il nome di AudioBufferSourceNode.noteOff() è stato cambiato in stop()
  • Il nome di OscillatorNode.noteOn() è stato cambiato in start()
  • Il nome di OscillatorNode.noteOff() è stato cambiato in stop()
  • Il nome di AudioParam.setTargetValueAtTime() è stato cambiato in setTargetAtTime()
  • AudioContext.createWaveTable() e OscillatorNode.setWaveTable() sono ora rinominati createPeriodicWave() andsetPeriodicWave()".
  • Rimozione di AudioBufferSourceNode.looping a favore di .loop rimossa
  • AudioContext.createBuffer(ArrayBuffer, boolean) per decodificare in modo sincrono un blob di dati audio codificati è stato rimosso. Le chiamate sincrone che richiedono molto tempo per essere completate non sono pratiche di programmazione; utilizza invece la chiamata decodeAudioData asincrona. Questa è una delle modifiche più impegnative in cui devi effettivamente cambiare il flusso della logica, ma è una pratica di gran lunga migliore. Ehsan Angkari di Mozilla ha scritto un bel esempio di come farlo nel post sulla conversione all'audio web standard.

Molti di questi (come la ridenominazione di createGainNode e la rimozione della decodifica sincrona in createBuffer) appaiono ovviamente nella console degli strumenti per sviluppatori come errori; tuttavia, alcuni altri, come questo utilizzo:

MULTI_LINE_CODE_PLACEHOLDER_1

non apparirà affatto e non verrà visualizzato in modo invisibile (myFilterNode.BANDPASS ora risulterà indefinito e il tentativo di impostare .type su undefined non produrrà alcun effetto). Questo, tra l'altro, era il motivo per cui il vocoder non funzionava). Allo stesso modo, la semplice assegnazione di filtro.type a un numero utilizzato funzionava:

myFilterNode.type = 2;

A questo punto devi usare l'enumerazione delle stringhe:

myFilterNode.type = “bandpass”;

Pertanto, ti consigliamo di eseguire l'algoritmo grep del codice per i seguenti termini:

  • 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 (sì, avrà molti falsi positivi, ma è l'unico modo per comprendere l'ultimo esempio riportato sopra)

Ancora una volta, se hai poco tempo e vuoi iniziare a usarlo, prendi una copia della my monkeypatch webkitAudioContext libreria e includila nella tua applicazione. Buon divertimento con Audio Hacking!