Webaudio-updates in Chrome 49,Webaudio-updates in Chrome 49

Chris Wilson
Chris Wilson

Chrome heeft de ondersteuning voor de Web Audio API consequent en stilletjes verbeterd. In Chrome 49 (bèta vanaf februari 2016 en naar verwachting stabiel in maart 2016) hebben we verschillende functies bijgewerkt om de specificatie bij te houden, en ook één nieuw knooppunt toegevoegd.

decodeAudioData() retourneert nu een belofte

De methode decodeAudioData () op AudioContext retourneert nu een Promise , waardoor op Promise gebaseerde asynchrone patroonafhandeling mogelijk wordt. De methode decodeAudioData() heeft altijd succes- en fout-callback-functies als parameters gebruikt:

context.decodeAudioData( arraybufferData, onSuccess, onError);

Maar nu kunt u in plaats daarvan de standaard Promise-methode gebruiken om de asynchrone aard van het decoderen van audiogegevens af te handelen:

context.decodeAudioData( arraybufferData ).then(
        (buffer) => { /* store the buffer */ },
        (reason) => { console.log("decode failed! " + reason) });

Hoewel dit er in een enkel voorbeeld uitgebreider uitziet, maken Promises asynchrone programmering eenvoudiger en consistenter. Voor compatibiliteit worden de callback-functies Success en Error nog steeds ondersteund, volgens de specificatie.

OfflineAudioContext ondersteunt nu suspend() en CV()

Op het eerste gezicht lijkt het misschien vreemd om suspend() op een OfflineAudioContext te hebben. suspend() is tenslotte aan AudioContext toegevoegd om het mogelijk te maken de audiohardware in de standby-modus te zetten, wat zinloos lijkt in scenario's waarin je naar een buffer rendert (wat natuurlijk is waar OfflineAudioContext voor is). Het doel van deze functie is echter om slechts een deel van een "score" tegelijk te kunnen construeren, om het geheugengebruik te minimaliseren. U kunt meer knooppunten maken terwijl u zich midden in een render bevindt.

De Maanlichtsonate van Beethoven bevat bijvoorbeeld ongeveer 6.500 noten . Elke "noot" wordt waarschijnlijk gedeconstrueerd tot ten minste een paar audiografiekknooppunten (bijvoorbeeld een AudioBuffer en een Gain-knooppunt). Als je de hele zeven en een halve minuut in een buffer wilt renderen met OfflineAudioContext , wil je waarschijnlijk niet al die knooppunten tegelijk maken. In plaats daarvan kun je ze in delen van de tijd maken:

var context = new OfflineAudioContext(2, length, sampleRate);
scheduleNextBlock();
context.startRendering().then( (buffer) => { /* store the buffer */ } );

function scheduleNextBlock() {
    // create any notes for the next blockSize number of seconds here
    // ...

    // make sure to tell the context to suspend again after this block;
    context.suspend(context.currentTime + blockSize).then( scheduleNextBlock );

    context.resume();
}

Hierdoor kunt u het aantal knooppunten dat vooraf moet worden gemaakt aan het begin van het renderen minimaliseren, en de geheugenbehoefte verminderen.

IIRFilterNode

De specificatie heeft een knooppunt toegevoegd voor audiofielen die hun eigen nauwkeurig gespecificeerde oneindige impulsreactie willen creëren: de IIRFilterNode . Dit filter is een aanvulling op de BiquadFilterNode, maar maakt volledige specificatie van de filterresponsparameters mogelijk (in plaats van de eenvoudig te gebruiken AudioParams van de BiquadFilterNode voor type, frequentie, Q en dergelijke). De IIRFilterNode maakt nauwkeurige specificatie mogelijk van filters die voorheen niet konden worden gemaakt, zoals filters van één orde; Het gebruik van de IIRFilterNode vereist echter enige diepgaande kennis van hoe IIR-filters werken, en ze zijn ook niet planbaar zoals BiquadFilterNodes.

Eerdere wijzigingen

Ik wil ook een paar verbeteringen noemen die eerder zijn doorgevoerd: in Chrome 48 begon BiquadFilter knooppuntautomatisering op audiosnelheid te draaien. De API is hiervoor helemaal niet veranderd, maar dit betekent dat je filter sweeps nog soepeler zullen klinken. Ook in Chrome 48 hebben we ketening toegevoegd aan de methode AudioNode.connect() door het knooppunt waarmee we verbinding maken terug te geven. Dit maakt het eenvoudiger om ketens van knooppunten te maken, zoals in dit voorbeeld :

sourceNode.connect(gainNode).connect(filterNode).connect(context.destination);

Dat is alles voor nu, en blijf rocken!

,

Chris Wilson
Chris Wilson

Chrome heeft de ondersteuning voor de Web Audio API consequent en stilletjes verbeterd. In Chrome 49 (bèta vanaf februari 2016 en naar verwachting stabiel in maart 2016) hebben we verschillende functies bijgewerkt om de specificatie bij te houden, en ook één nieuw knooppunt toegevoegd.

decodeAudioData() retourneert nu een belofte

De methode decodeAudioData () op AudioContext retourneert nu een Promise , waardoor op Promise gebaseerde asynchrone patroonafhandeling mogelijk wordt. De methode decodeAudioData() heeft altijd succes- en fout-callback-functies als parameters gebruikt:

context.decodeAudioData( arraybufferData, onSuccess, onError);

Maar nu kunt u in plaats daarvan de standaard Promise-methode gebruiken om de asynchrone aard van het decoderen van audiogegevens af te handelen:

context.decodeAudioData( arraybufferData ).then(
        (buffer) => { /* store the buffer */ },
        (reason) => { console.log("decode failed! " + reason) });

Hoewel dit er in een enkel voorbeeld uitgebreider uitziet, maken Promises asynchrone programmering eenvoudiger en consistenter. Voor compatibiliteit worden de callback-functies Success en Error nog steeds ondersteund, volgens de specificatie.

OfflineAudioContext ondersteunt nu suspend() en CV()

Op het eerste gezicht lijkt het misschien vreemd om suspend() op een OfflineAudioContext te hebben. suspend() is tenslotte aan AudioContext toegevoegd om het mogelijk te maken de audiohardware in de standby-modus te zetten, wat zinloos lijkt in scenario's waarin je naar een buffer rendert (wat natuurlijk is waar OfflineAudioContext voor is). Het doel van deze functie is echter om slechts een deel van een "score" tegelijk te kunnen construeren, om het geheugengebruik te minimaliseren. U kunt meer knooppunten maken terwijl u zich midden in een render bevindt.

De Maanlichtsonate van Beethoven bevat bijvoorbeeld ongeveer 6.500 noten . Elke "noot" wordt waarschijnlijk gedeconstrueerd tot ten minste een paar audiografiekknooppunten (bijvoorbeeld een AudioBuffer en een Gain-knooppunt). Als je de hele zeven en een halve minuut in een buffer wilt weergeven met OfflineAudioContext , wil je waarschijnlijk niet al die knooppunten tegelijk maken. In plaats daarvan kun je ze in delen van de tijd maken:

var context = new OfflineAudioContext(2, length, sampleRate);
scheduleNextBlock();
context.startRendering().then( (buffer) => { /* store the buffer */ } );

function scheduleNextBlock() {
    // create any notes for the next blockSize number of seconds here
    // ...

    // make sure to tell the context to suspend again after this block;
    context.suspend(context.currentTime + blockSize).then( scheduleNextBlock );

    context.resume();
}

Hierdoor kunt u het aantal knooppunten dat vooraf moet worden gemaakt aan het begin van het renderen minimaliseren, en de geheugenbehoefte verminderen.

IIRFilterNode

De specificatie heeft een knooppunt toegevoegd voor audiofielen die hun eigen nauwkeurig gespecificeerde oneindige impulsreactie willen creëren: de IIRFilterNode . Dit filter is een aanvulling op de BiquadFilterNode, maar maakt volledige specificatie van de filterresponsparameters mogelijk (in plaats van de eenvoudig te gebruiken AudioParams van de BiquadFilterNode voor type, frequentie, Q en dergelijke). De IIRFilterNode maakt nauwkeurige specificatie mogelijk van filters die voorheen niet konden worden gemaakt, zoals filters van één orde; Het gebruik van de IIRFilterNode vereist echter enige diepgaande kennis van hoe IIR-filters werken, en ze zijn ook niet planbaar zoals BiquadFilterNodes.

Eerdere wijzigingen

Ik wil ook een paar verbeteringen noemen die eerder zijn doorgevoerd: in Chrome 48 begon BiquadFilter knooppuntautomatisering op audiosnelheid te draaien. De API is hiervoor helemaal niet veranderd, maar dit betekent dat je filter sweeps nog soepeler zullen klinken. Ook in Chrome 48 hebben we ketening toegevoegd aan de methode AudioNode.connect() door het knooppunt waarmee we verbinding maken terug te geven. Dit maakt het eenvoudiger om ketens van knooppunten te maken, zoals in dit voorbeeld :

sourceNode.connect(gainNode).connect(filterNode).connect(context.destination);

Dat is alles voor nu, en blijf rocken!