OfflineAudioContext Incremental Rendering#2675
Conversation
|
@hoch @padenot @mjwilson-google, this is the first draft for While writing this, we had some open questions that might be better to discuss here:
(unfortunately, there is no preview available, but I think there might be something actually broken in the repo's CI pipeline) |
|
Audio WG meeting (06/11/2026) discussion:
|
mjwilson-google
left a comment
There was a problem hiding this comment.
I added some comments. Also, I think I fixed the Git workflow issue if you rebase the change on the latest commit.
| <em>No parameters.</em> | ||
| </div> | ||
| <pre class=argumentdef for="OfflineAudioContext/startRendering()"> | ||
| chunkSize: The size of the desired {{AudioBuffer}}. |
There was a problem hiding this comment.
I think we should say something like the number of sample-frames to render during this call.
| constructor(OfflineAudioContextOptions contextOptions); | ||
| constructor(unsigned long numberOfChannels, unsigned long length, float sampleRate); | ||
| Promise<AudioBuffer> startRendering(); | ||
| Promise<AudioBuffer> startRendering(unsigned long chunkSize); |
There was a problem hiding this comment.
I think this should be optional unsigned long chunkSize
| @@ -2500,9 +2480,10 @@ returned promise with the rendered result as an | |||
| interface OfflineAudioContext : BaseAudioContext { | |||
| constructor(OfflineAudioContextOptions contextOptions); | |||
| constructor(unsigned long numberOfChannels, unsigned long length, float sampleRate); | |||
There was a problem hiding this comment.
If we make length nullable I think it would become length?
| <ol> | ||
| <li> If {{OfflineAudioContext/startRendering(chunkSize)/chunkSize}} is provided: | ||
| <ol> | ||
| <li> Let <var>renderedFrames</var> be the number of sample-frames already rendered by the {{OfflineAudioContext}}. |
There was a problem hiding this comment.
We may want renderedFrames to be an internal slot; then we can also specify when and how it is updated.
|
It looks like the git checks are now passing but the PR preview still isn't working; sorry. I'm not sure why. |
This PR proposes changes to the Web Audio spec to enable rendering audio from
OfflineAudioContextsin chunks.Github issue: #2445
Feature explainer: https://github.com/MicrosoftEdge/MSEdgeExplainers/blob/main/OfflineAudioContext/explainer.md
💥 Error: 422 Unprocessable Entity 💥
PR Preview failed to build. (Last tried on Jun 11, 2026, 10:20 PM UTC).
More
PR Preview relies on a number of web services to run. There seems to be an issue with the following one:
🚨 Spec Generator - Spec Generator is the web service used to build bikeshed/ReSpec specs
🔗 Related URL
Error output:
[ { "lineNum": "4259:25", "messageType": "warning", "text": "At least one <img> doesn't have its size set (<img bs-line-number=\"4259:25\" alt=\"Graphical representation of calling cancelAndHoldAtTime when linearRampToValueAtTime has been called at this time.\" src=\"images/cancel-linear.svg\" style=\"height:75%;width:75%\">), but given the type of input document, Bikeshed can't figure out what the size should be.\nEither set 'width'/'height' manually, or opt out of auto-detection by setting the 'no-autosize' attribute." }, { "lineNum": "2574:9", "messageType": "fatal", "text": "Can't find the 'contextOptions' argument of method 'OfflineAudioContext/constructor(numberOfChannels, length, sampleRate)' in the argumentdef block." }, { "lineNum": "3758:9", "messageType": "fatal", "text": "Can't find the 'destinationNode' argument of method 'AudioNode/connect(destinationParam, output)' in the argumentdef block." }, { "lineNum": "3758:9", "messageType": "fatal", "text": "Can't find the 'input' argument of method 'AudioNode/connect(destinationParam, output)' in the argumentdef block." }, { "lineNum": "3859:9", "messageType": "fatal", "text": "Can't find the 'destinationNode' argument of method 'AudioNode/disconnect(destinationParam, output)' in the argumentdef block." }, { "lineNum": "3872:9", "messageType": "fatal", "text": "Can't find the 'destinationNode' argument of method 'AudioNode/disconnect(destinationParam, output)' in the argumentdef block." }, { "lineNum": "3887:9", "messageType": "fatal", "text": "Can't find the 'destinationNode' argument of method 'AudioNode/disconnect(destinationParam, output)' in the argumentdef block." }, { "lineNum": "3887:9", "messageType": "fatal", "text": "Can't find the 'input' argument of method 'AudioNode/disconnect(destinationParam, output)' in the argumentdef block." }, { "lineNum": "261:36", "messageType": "link", "text": "Multiple possible 'audio' element refs.\nArbitrarily chose https://html.spec.whatwg.org/multipage/media.html#audio\nTo auto-select one of the following refs, insert one of these lines into a <pre class=link-defaults> block:\nspec:html; type:element; text:audio\nspec:epub-34; type:element; text:audio" }, { "lineNum": "309:39", "messageType": "link", "text": "Multiple possible 'audio' element refs.\nArbitrarily chose https://html.spec.whatwg.org/multipage/media.html#audio\nTo auto-select one of the following refs, insert one of these lines into a <pre class=link-defaults> block:\nspec:html; type:element; text:audio\nspec:epub-34; type:element; text:audio" }, { "lineNum": "633:5", "messageType": "link", "text": "Multiple possible 'audio' element refs.\nArbitrarily chose https://html.spec.whatwg.org/multipage/media.html#audio\nTo auto-select one of the following refs, insert one of these lines into a <pre class=link-defaults> block:\nspec:html; type:element; text:audio\nspec:epub-34; type:element; text:audio" }, { "lineNum": "1213:9", "messageType": "link", "text": "Multiple possible 'audio' element refs.\nArbitrarily chose https://html.spec.whatwg.org/multipage/media.html#audio\nTo auto-select one of the following refs, insert one of these lines into a <pre class=link-defaults> block:\nspec:html; type:element; text:audio\nspec:epub-34; type:element; text:audio" }, { "lineNum": "2980:15", "messageType": "link", "text": "Multiple possible 'audio' element refs.\nArbitrarily chose https://html.spec.whatwg.org/multipage/media.html#audio\nTo auto-select one of the following refs, insert one of these lines into a <pre class=link-defaults> block:\nspec:html; type:element; text:audio\nspec:epub-34; type:element; text:audio" }, { "lineNum": "23:9 of file 'audionode.include' (included by a block on 4879:1)", "messageType": "link", "text": "No 'idl' refs found for '[CC-MODE]'." }, { "lineNum": "27:9 of file 'audionode.include' (included by a block on 4879:1)", "messageType": "link", "text": "No 'idl' refs found for '[CC-INTERP]'." }, { "lineNum": "23:9 of file 'audionode.include' (included by a block on 5293:1)", "messageType": "link", "text": "No 'idl' refs found for '[CC-MODE]'." }, { "lineNum": "27:9 of file 'audionode.include' (included by a block on 5293:1)", "messageType": "link", "text": "No 'idl' refs found for '[CC-INTERP]'." }, { "lineNum": "23:9 of file 'audionode.include' (included by a block on 5951:1)", "messageType": "link", "text": "No 'idl' refs found for '[CC-MODE]'." }, { "lineNum": "27:9 of file 'audionode.include' (included by a block on 5951:1)", "messageType": "link", "text": "No 'idl' refs found for '[CC-INTERP]'." }, { "lineNum": "23:9 of file 'audionode.include' (included by a block on 5971:1)", "messageType": "link", "text": "No 'idl' refs found for '[CC-MODE]'." }, { "lineNum": "27:9 of file 'audionode.include' (included by a block on 5971:1)", "messageType": "link", "text": "No 'idl' refs found for '[CC-INTERP]'." }, { "lineNum": "23:9 of file 'audionode.include' (included by a block on 6433:1)", "messageType": "link", "text": "No 'idl' refs found for '[CC-MODE]'." }, { "lineNum": "27:9 of file 'audionode.include' (included by a block on 6433:1)", "messageType": "link", "text": "No 'idl' refs found for '[CC-INTERP]'." }, { "lineNum": "23:9 of file 'audionode.include' (included by a block on 7010:1)", "messageType": "link", "text": "No 'idl' refs found for '[CC-MODE]'." }, { "lineNum": "27:9 of file 'audionode.include' (included by a block on 7010:1)", "messageType": "link", "text": "No 'idl' refs found for '[CC-INTERP]'." }, { "lineNum": "23:9 of file 'audionode.include' (included by a block on 7126:1)", "messageType": "link", "text": "No 'idl' refs found for '[CC-MODE]'." }, { "lineNum": "27:9 of file 'audionode.include' (included by a block on 7126:1)", "messageType": "link", "text": "No 'idl' refs found for '[CC-INTERP]'." }, { "lineNum": "23:9 of file 'audionode.include' (included by a block on 7243:1)", "messageType": "link", "text": "No 'idl' refs found for '[CC-MODE]'." }, { "lineNum": "27:9 of file 'audionode.include' (included by a block on 7243:1)", "messageType": "link", "text": "No 'idl' refs found for '[CC-INTERP]'." }, { "lineNum": "23:9 of file 'audionode.include' (included by a block on 7338:1)", "messageType": "link", "text": "No 'idl' refs found for '[CC-MODE]'." }, { "lineNum": "27:9 of file 'audionode.include' (included by a block on 7338:1)", "messageType": "link", "text": "No 'idl' refs found for '[CC-INTERP]'." }, { "lineNum": "23:9 of file 'audionode.include' (included by a block on 7613:1)", "messageType": "link", "text": "No 'idl' refs found for '[CC-MODE]'." }, { "lineNum": "27:9 of file 'audionode.include' (included by a block on 7613:1)", "messageType": "link", "text": "No 'idl' refs found for '[CC-INTERP]'." }, { "lineNum": "23:9 of file 'audionode.include' (included by a block on 7791:1)", "messageType": "link", "text": "No 'idl' refs found for '[CC-MODE]'." }, { "lineNum": "27:9 of file 'audionode.include' (included by a block on 7791:1)", "messageType": "link", "text": "No 'idl' refs found for '[CC-INTERP]'." }, { "lineNum": "23:9 of file 'audionode.include' (included by a block on 8252:1)", "messageType": "link", "text": "No 'idl' refs found for '[CC-MODE]'." }, { "lineNum": "27:9 of file 'audionode.include' (included by a block on 8252:1)", "messageType": "link", "text": "No 'idl' refs found for '[CC-INTERP]'." }, { "lineNum": "23:9 of file 'audionode.include' (included by a block on 8364:1)", "messageType": "link", "text": "No 'idl' refs found for '[CC-MODE]'." }, { "lineNum": "27:9 of file 'audionode.include' (included by a block on 8364:1)", "messageType": "link", "text": "No 'idl' refs found for '[CC-INTERP]'." }, { "lineNum": "8510:51", "messageType": "link", "text": "Multiple possible 'audio' element refs.\nArbitrarily chose https://html.spec.whatwg.org/multipage/media.html#audio\nTo auto-select one of the following refs, insert one of these lines into a <pre class=link-defaults> block:\nspec:html; type:element; text:audio\nspec:epub-34; type:element; text:audio" }, { "lineNum": "23:9 of file 'audionode.include' (included by a block on 8646:1)", "messageType": "link", "text": "No 'idl' refs found for '[CC-MODE]'." }, { "lineNum": "27:9 of file 'audionode.include' (included by a block on 8646:1)", "messageType": "link", "text": "No 'idl' refs found for '[CC-INTERP]'." }, { "lineNum": "23:9 of file 'audionode.include' (included by a block on 8936:1)", "messageType": "link", "text": "No 'idl' refs found for '[CC-MODE]'." }, { "lineNum": "27:9 of file 'audionode.include' (included by a block on 8936:1)", "messageType": "link", "text": "No 'idl' refs found for '[CC-INTERP]'." }, { "lineNum": "23:9 of file 'audionode.include' (included by a block on 9195:1)", "messageType": "link", "text": "No 'idl' refs found for '[CC-MODE]'." }, { "lineNum": "27:9 of file 'audionode.include' (included by a block on 9195:1)", "messageType": "link", "text": "No 'idl' refs found for '[CC-INTERP]'." }, { "lineNum": "23:9 of file 'audionode.include' (included by a block on 9971:1)", "messageType": "link", "text": "No 'idl' refs found for '[CC-MODE]'." }, { "lineNum": "27:9 of file 'audionode.include' (included by a block on 9971:1)", "messageType": "link", "text": "No 'idl' refs found for '[CC-INTERP]'." }, { "lineNum": "23:9 of file 'audionode.include' (included by a block on 10040:1)", "messageType": "link", "text": "No 'idl' refs found for '[CC-MODE]'." }, { "lineNum": "27:9 of file 'audionode.include' (included by a block on 10040:1)", "messageType": "link", "text": "No 'idl' refs found for '[CC-INTERP]'." }, { "lineNum": "23:9 of file 'audionode.include' (included by a block on 10153:1)", "messageType": "link", "text": "No 'idl' refs found for '[CC-MODE]'." }, { "lineNum": "27:9 of file 'audionode.include' (included by a block on 10153:1)", "messageType": "link", "text": "No 'idl' refs found for '[CC-INTERP]'." }, { "lineNum": "23:9 of file 'audionode.include' (included by a block on 10794:1)", "messageType": "link", "text": "No 'idl' refs found for '[CC-MODE]'." }, { "lineNum": "27:9 of file 'audionode.include' (included by a block on 10794:1)", "messageType": "link", "text": "No 'idl' refs found for '[CC-INTERP]'." }, { "lineNum": "13463:1", "messageType": "warning", "text": "W3C policy requires Privacy Considerations and Security Considerations to be separate sections, but you appear to have them combined into one." }, { "lineNum": null, "messageType": "failure", "text": "Did not generate, due to errors exceeding the allowed error level." } ]This seems to be an issue with the Spec Generator service. PR Preview doesn't manage this service and so has no control over it. If you've identified an issue with it, you can report the issue to the maintainers of Spec Generator directly. Please be courteous. Thank you!
If you don't have enough information above to solve the error by yourself or if the issue doesn't seem related to Spec Generator, you can file an issue with PR Preview.