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'oggettoBiquadFilterNode
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 increateGain
createDelayNode
è stato rinominato increateDelay
createJavaScriptNode
è stato rinominato increateScriptProcessor
AudioBufferSourceNode.noteOn()
è ora sostituito dastart()
- Anche
AudioBufferSourceNode.noteGrainOn()
è ora sostituito dastart()
- Il nome di
AudioBufferSourceNode.noteOff()
è stato cambiato instop()
- Il nome di
OscillatorNode.noteOn()
è stato cambiato instart()
- Il nome di
OscillatorNode.noteOff()
è stato cambiato instop()
- Il nome di
AudioParam.setTargetValueAtTime()
è stato cambiato insetTargetAtTime()
AudioContext.createWaveTable()
eOscillatorNode.setWaveTable()
sono ora rinominaticreatePeriodicWave() and
setPeriodicWave()".- 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!