Modifiche all'audio web in m36

Chris Wilson
Chris Wilson

Modifiche a Web Audio

In Google amiamo gli standard. La nostra missione è sviluppare la piattaforma web basata su standard. Uno dei piccoli problemi che abbiamo riscontrato per un po' di tempo è stata l'implementazione dell'API Web Audio con prefisso webkit- (in particolare l'oggetto webkitAudioContext) e alcuni componenti di Web Audio deprecati che abbiamo continuato a supportare.

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

Rimuoveremo completamente il supporto del prefisso dopo Chrome 36, probabilmente in un paio di release. Pubblicheremo un annuncio qui quando la modifica sarà imminente e continueremo a contattare gli autori per correggere le loro applicazioni Web Audio.

Perché abbiamo fatto questo, anziché ripristinare l'implementazione precedente? In parte, abbiamo avuto timore di fare un passo troppo indietro. Abbiamo già rimosso queste API e, come piacevole effetto collaterale di questo aliasing, le applicazioni possono funzionare perfettamente su Firefox, che non ha mai supportato un oggetto AudioContext con prefisso (e giustamente!) nel supporto di Web Audio inizialmente rilasciato lo scorso autunno.

La parte rimanente di questo aggiornamento fornisce una guida per correggere i problemi che potrebbero verificarsi nel codice a causa di questa modifica. La cosa fantastica della risoluzione di questi problemi è che è molto probabile che il codice funzioni anche in Firefox. (Per molto tempo ho pensato che la mia applicazione Vocoder non funzionasse a causa dell'implementazione di Firefox, ma in realtà era uno di questi problemi!)

Se vuoi solo iniziare a utilizzare la libreria, dai un'occhiata a una libreria di monkey-patch che ho scritto per le applicazioni scritte con il vecchio codice Web Audio. Può aiutarti a iniziare a utilizzare la libreria in un tempo minimo, poiché assocerà gli alias agli oggetti e ai metodi in modo appropriato. Infatti, le patch elencate nella libreria sono una buona guida per le modifiche apportate.

Innanzitutto

Eventuali riferimenti a window.webkitAudioContext devono essere fatti a window.AudioContext. Spesso il problema è stato risolto con una semplice:

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

Se la tua app risponde con un messaggio simile a "Purtroppo il tuo browser non supporta Web Audio. Utilizza Chrome o Safari." È molto probabile che stia cercando esplicitamente webkitAudioContext. Sviluppatore pessimo! Potresti supportare Firefox da mesi.

Esistono però altre rimozioni di codice più sottili, alcune delle quali possono essere meno evidenti.

  • Le costanti di tipo enumerato BiquadFilter per l'attributo .type (che ora è una stringa) non vengono più visualizzate nell'oggetto BiquadFilterNode e non le supportiamo nell'attributo .type. Quindi non usi più .LOWPASS (o 0), ma lo imposti su "lowpass".
  • Analogamente, l'attributo Oscillator.type ora è un tipo enumerato di stringa, quindi non è più necessario .SAWTOOTH.
  • PannerNode.type ora è anche un tipo enumerato di stringa.
  • PannerNode.distanceModel ora è anche un tipo enumerato di stringa.
  • createGainNode è stato rinominato createGain
  • createDelayNode è stato rinominato createDelay
  • createJavaScriptNode è stato rinominato createScriptProcessor
  • AudioBufferSourceNode.noteOn() è ora sostituito da start()
  • Anche AudioBufferSourceNode.noteGrainOn() è ora sostituito da start()
  • AudioBufferSourceNode.noteOff() è stato rinominato stop()
  • OscillatorNode.noteOn() è stato rinominato start()
  • OscillatorNode.noteOff() è stato rinominato stop()
  • AudioParam.setTargetValueAtTime() è stato rinominato setTargetAtTime()
  • AudioContext.createWaveTable() e OscillatorNode.setWaveTable() sono stati rinominati createPeriodicWave() andsetPeriodicWave()`.
  • AudioBufferSourceNode.looping è stato rimosso in favore di .loop
  • AudioContext.createBuffer(ArrayBuffer, boolean) per decodificare in modo sincrono un blob di dati audio codificati è stata rimossa. Le chiamate sincrone che richiedono molto tempo per essere completate sono una cattiva pratica di codifica. Utilizza invece la chiamata asincrona decodeAudioData. Si tratta di una delle modifiche più complesse, in quanto devi modificare il flusso logico, ma è una pratica molto migliore. Ehsan Angkari di Mozilla ha scritto un bel esempio di come eseguire questa operazione nel suo post sulla conversione a Web Audio standard.

Molti di questi (come la ridenominazione di createGainNode e la rimozione della decodifica sincrona in createBuffer) verranno ovviamente visualizzati nella console degli Strumenti per sviluppatori come errori, ma altri, come questo utilizzo:

MULTI_LINE_CODE_PLACEHOLDER_1

non verrà visualizzato e non genererà errori (ora myFilterNode.BANDPASS verrà risolto in undefined e il tentativo di impostare .type su undefined non produrrà alcun effetto. A proposito, questo era il motivo dell'errore del vocoder. Allo stesso modo, l'assegnazione di filter.type a un numero funzionava:

myFilterNode.type = 2;

Ora, però, devi utilizzare l'enumerazione di stringhe:

myFilterNode.type = bandpass;

Pertanto, ti consigliamo di eseguire grep nel codice per trovare 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ì, ci saranno molti falsi positivi, ma è l'unico modo per rilevare l'ultimo esempio riportato sopra).

Ancora una volta, se hai fretta e vuoi iniziare a utilizzare la funzionalità, scarica una copia della mia libreria webkitAudioContext con monkeypatch e includila nella tua applicazione. Buon audio hacking!