Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

TAG issue: Constructibility & De-sugaring of static methods #250

Closed
Assignees
joeberkovitz
Labels
Needs EditsDecision has been made, the issue can be fixed. https://speced.github.io/spec-maintenance/about/tag-trackerGroup bringing to attention of the TAG, or tracked by the TAG but not needing response.
Milestone
@chrislo

Description

@chrislo

The following issue was raised by the W3C TAG as part of theirreview of the Web Audio API

Constructibility & De-sugaring of static methods

The current API defines 26 interfaces:

$ cat webaudio.idl | grep -i interface | cut -d " " -f 2AudioContextOfflineAudioContextOfflineAudioCompletionEventAudioNodeAudioDestinationNodeAudioParamGainNodeDelayNodeAudioBufferAudioBufferSourceNodeMediaElementAudioSourceNodeScriptProcessorNodeAudioProcessingEventPannerNodeAudioListenerConvolverNodeAnalyserNodeChannelSplitterNodeChannelMergerNodeDynamicsCompressorNodeBiquadFilterNodeWaveShaperNodeOscillatorNodePeriodicWaveMediaStreamAudioSourceNodeMediaStreamAudioDestinationNode

Of these, only two are marked constructible:

$ cat webaudio.idl | grep -A 1 -i constructor | grep interface | cut -d " " -f 2AudioContextOfflineAudioContext

Most of the types represented by the non-constructable interfacesare visible in the API through normal use. For instance, to get aPannerNode instance a developer currently uses:

var panner = context.createPanner();

Wherecontext is an instance ofAudioContext (or one of its subclasses). Prickly questions arise from this arrangement:

  1. Assuming that the static methods on thecontext are desirable shortcuts for wiring up the context of aNode instance to thecontext against which it runs,how does that context get set in a way that would allow pure JS objects to describe it?
  2. By what privileged mechanism does the system create instances of these types if they do not have constructors?
  3. Are these types in any way subclassable? If not, why not?
  4. If the intent is to mirror other DOM APIs, it's curious to havecreate*() methods but no factory (e.g.:createElement("tagname"))

Adding constructors and context-setting methods (or constructor params) for most of the interfaces that lack them would answer #'s 1 and 2 and largely obviate 4. E.g.:

// A possible de-sugaring for createPanner() when ctors are defined:AudioContext.prototype.createPanner=function(){varp=newPannerNode();p.context=this;returnp;};// An alternative that provides the context via the PannerNode ctor:AudioContext.prototype.createPanner=function(){returnnewPannerNode({context:this});};// An alternative that uses a positional context param:AudioContext.prototype.createPanner=function(attributes){returnnewPannerNode(this,attributes);};

Either constructor style allows theseAudioNode types to conceptually be modeled more cleanly as JS objects which could self-host.

Of course, this requires answering the follow-on questions "what happens if the context is invalid, changes, or is never set?", but those are reasonable to ask and their answers don't need to be complicated (certainly not for v1).

An alternative design might locate the constructors on the context directly, but this seems to create as many problems as it solves.

Using the constructor style from the last variant, we can re-work one of the examples from Section 7:

...varcontext=newAudioContext();...functionplaySound(){varoneShotSound=context.createBufferSource();oneShotSound.buffer=dogBarkingBuffer;// Create a filter, panner, and gain node.varlowpass=context.createBiquadFilter();varpanner=context.createPanner();panner.panningModel="equalpower";panner.distanceModel="linear";vargainNode2=context.createGain();// Make connectionsoneShotSound.connect(lowpass);lowpass.connect(panner);panner.connect(gainNode2);gainNode2.connect(compressor);oneShotSound.start(context.currentTime+0.75);}

to:

...varcontext=newAudioContext();...functionplaySound(){varoneShotSound=newBufferSource(context,{buffer:dogBarkingBuffer});// Create a filter, panner, and gain node.varlowpass=newBiquadFilterNode(context);varpanner=newPannerNode(context,{panningModel:"equalpower",distanceModel:"linear"});vargainNode2=newGainNode(context);// Make connectionsoneShotSound.connect(lowpass);lowpass.connect(panner);panner.connect(gainNode2);gainNode2.connect(compressor);oneShotSound.start(context.currentTime+0.75);}

Metadata

Metadata

Assignees

Labels

Needs EditsDecision has been made, the issue can be fixed. https://speced.github.io/spec-maintenance/about/tag-trackerGroup bringing to attention of the TAG, or tracked by the TAG but not needing response.

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions


    [8]ページ先頭

    ©2009-2025 Movatter.jp