<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40"><head><meta http-equiv=Content-Type content="text/html; charset=utf-8"><meta name=Generator content="Microsoft Word 15 (filtered medium)"><style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Consolas;
        panose-1:2 11 6 9 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
span.EmailStyle18
        {mso-style-type:personal-reply;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri",sans-serif;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]--></head><body lang=EN-US link=blue vlink=purple style='word-wrap:break-word'><div class=WordSection1><p class=MsoNormal>Doug, thanks for continuing implementation efforts and close scrutiny.  Very important.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Dr. Malamos is not available this week so we’ll push audio discussion back to Friday 3 MAR.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Seems like a lot has accumulated, should you consolidate your recommendations?  Am thinking we should collectively review and respond to the full set.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>We can talk during tomorrow’s call about how to document all this – perhaps in Mantis with periodic email updates, or a dedicated issues page.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>In any case, TIA.<o:p></o:p></p><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Courier New"'><o:p> </o:p></span></p><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Courier New"'>all the best, Don<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Courier New"'>-- <o:p></o:p></span></p><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Courier New"'>Don Brutzman  Naval Postgraduate School, Code USW/Br        brutzman@nps.edu<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Courier New"'>Watkins 270,  MOVES Institute, Monterey CA 93943-5000 USA    +1.831.656.2149<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Courier New"'>X3D graphics, virtual worlds, Navy robotics https://</span> <span style='font-size:10.0pt;font-family:"Courier New"'>faculty.nps.edu/brutzman<o:p></o:p></span></p><p class=MsoNormal><o:p> </o:p></p><div style='border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0in 0in 0in'><p class=MsoNormal><b>From:</b> x3d-public <x3d-public-bounces@web3d.org> <b>On Behalf Of </b>GPU Group<br><b>Sent:</b> Thursday, February 23, 2023 2:46 PM<br><b>To:</b> X3D Graphics public mailing list <x3d-public@web3d.org><br><b>Subject:</b> [x3d-public] Sound v4 > Convolver, BufferAudioNode RECOMMENDATIONS<o:p></o:p></p></div><p class=MsoNormal><o:p> </o:p></p><div><div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>RECOMMENDATIONS<o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>1. Convolver: change MFFloat buffer to SFNode buffer [AudioBuffer]<o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>2. Add AudioBuffer node type<o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>3. Refactor BufferAudioSource to delegate loading to AudioBuffer<o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>4. browser developers: beware implementing BufferAudioSource via web audio AudioBufferSource<o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'> -Doug Sanden<o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><o:p> </o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>Explanation:<o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>Convolver is incomplete because it doesn't have a field to specifiy the number of channels in the buffer. Without that, there's no way to know how many channel chunks to split the MFFloat PCM32 data into. Yet the documentation claims it can have any number of channels.<o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>3 options to fix:<o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>a) in text, say single channel only<o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>b) add a bufferChannels field<o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>c) delegate loading to AudIoBuffer node<o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>I recommend c) to gain the additional benefits of URL loading. Most web audio Convolver examples load impulse response data from .wav files.<o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><a href="https://nam10.safelinks.protection.outlook.com/?url=https%3A%2F%2Fmiddleearmedia.com%2Fweb-audio-api-convolver-node%2F&data=05%7C01%7Cbrutzman%40nps.edu%7Cea6199f665ae4be3a9c108db15efe48f%7C6d936231a51740ea9199f7578963378e%7C0%7C0%7C638127893310275903%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000%7C%7C%7C&sdata=OQwJwzS5WRuG6CmBOYdhvMYSUVJW3Jm3XMYonwpxeUE%3D&reserved=0">https://middleearmedia.com/web-audio-api-convolver-node/</a> <o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>In web audio, both Convolver and AudioBufferSource have a .buffer field that takes an AudioBuffer node. <o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><a href="https://nam10.safelinks.protection.outlook.com/?url=https%3A%2F%2Fdeveloper.mozilla.org%2Fen-US%2Fdocs%2FWeb%2FAPI%2FConvolverNode&data=05%7C01%7Cbrutzman%40nps.edu%7Cea6199f665ae4be3a9c108db15efe48f%7C6d936231a51740ea9199f7578963378e%7C0%7C0%7C638127893310275903%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000%7C%7C%7C&sdata=KKOT0ipVtlTlmI8%2FvGJcUJlzXW4dgsqhWXcPq%2BYgcww%3D&reserved=0">https://developer.mozilla.org/en-US/docs/Web/API/ConvolverNode</a> <o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>- example code shows loading AudioBuffer from .wav<o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><a href="https://nam10.safelinks.protection.outlook.com/?url=https%3A%2F%2Fdeveloper.mozilla.org%2Fen-US%2Fdocs%2FWeb%2FAPI%2FAudioBufferSourceNode&data=05%7C01%7Cbrutzman%40nps.edu%7Cea6199f665ae4be3a9c108db15efe48f%7C6d936231a51740ea9199f7578963378e%7C0%7C0%7C638127893310275903%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000%7C%7C%7C&sdata=R%2FFHxQcfqphgzKiTcFHWVLnGopvKVm4HdoEh%2FDRUTSI%3D&reserved=0">https://developer.mozilla.org/en-US/docs/Web/API/AudioBufferSourceNode</a> <o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>- example code shows loading PCM data in AudioBuffer algorithmically at run time<o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><a href="https://nam10.safelinks.protection.outlook.com/?url=https%3A%2F%2Fdeveloper.mozilla.org%2Fen-US%2Fdocs%2FWeb%2FAPI%2FAudioBuffer&data=05%7C01%7Cbrutzman%40nps.edu%7Cea6199f665ae4be3a9c108db15efe48f%7C6d936231a51740ea9199f7578963378e%7C0%7C0%7C638127893310275903%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000%7C%7C%7C&sdata=I2IYy7jXY%2BIkT1kYY6v%2BBtYf3xpF%2BzNjV8b4gGJt8mM%3D&reserved=0">https://developer.mozilla.org/en-US/docs/Web/API/AudioBuffer</a> <o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>- explains 2 ways to load data, from .wav or from raw data (PCM)<o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'> <o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>Having both BufferAudioSource and Convolver delegate loading to AudioBuffer will reduce code needed, match web audio, while fixing Convolver shortcoming and adding url loading to Convolver through AudioBuffer<o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>i have the recommendations working in freewrl with these scene files:<o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><a href="https://nam10.safelinks.protection.outlook.com/?url=https%3A%2F%2Ffreewrl.sourceforge.io%2Ftests%2F16_Sound%2Fconvolver_control.wrl&data=05%7C01%7Cbrutzman%40nps.edu%7Cea6199f665ae4be3a9c108db15efe48f%7C6d936231a51740ea9199f7578963378e%7C0%7C0%7C638127893310275903%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000%7C%7C%7C&sdata=NboaUmYfeyYfgYIOIXKUk6Sm34n2G617tJ%2FDv6%2FZpnY%3D&reserved=0">https://freewrl.sourceforge.io/tests/16_Sound/convolver_control.wrl</a>  <o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><a href="https://nam10.safelinks.protection.outlook.com/?url=https%3A%2F%2Ffreewrl.sourceforge.io%2Ftests%2F16_Sound%2Fconvolver_control_PCM.wrl&data=05%7C01%7Cbrutzman%40nps.edu%7Cea6199f665ae4be3a9c108db15efe48f%7C6d936231a51740ea9199f7578963378e%7C0%7C0%7C638127893310275903%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000%7C%7C%7C&sdata=F72OplQ93ljYIgGDnDPcO1W%2Bassh6CWl6y8YXP%2BX9jY%3D&reserved=0">https://freewrl.sourceforge.io/tests/16_Sound/convolver_control_PCM.wrl</a>  <o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><a href="https://nam10.safelinks.protection.outlook.com/?url=https%3A%2F%2Ffreewrl.sourceforge.io%2Ftests%2F16_Sound%2FBufferAudioSource.x3d&data=05%7C01%7Cbrutzman%40nps.edu%7Cea6199f665ae4be3a9c108db15efe48f%7C6d936231a51740ea9199f7578963378e%7C0%7C0%7C638127893310275903%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000%7C%7C%7C&sdata=F1%2Fg3Xtx4cmBaW3orMWW0VA6L3QrGLrrRGXClp1SL3A%3D&reserved=0">https://freewrl.sourceforge.io/tests/16_Sound/BufferAudioSource.x3d</a> <o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'> <o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>Implementing BufferAudioSource<o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><a href="https://nam10.safelinks.protection.outlook.com/?url=https%3A%2F%2Fdeveloper.mozilla.org%2Fen-US%2Fdocs%2FWeb%2FAPI%2FAudioBufferSourceNode&data=05%7C01%7Cbrutzman%40nps.edu%7Cea6199f665ae4be3a9c108db15efe48f%7C6d936231a51740ea9199f7578963378e%7C0%7C0%7C638127893310275903%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000%7C%7C%7C&sdata=R%2FFHxQcfqphgzKiTcFHWVLnGopvKVm4HdoEh%2FDRUTSI%3D&reserved=0">https://developer.mozilla.org/en-US/docs/Web/API/AudioBufferSourceNode</a> <o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>"It will automatically be garbage-collected" sometime after it quits playing.<o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>The unusual nature of automatic garbage collection in procedural code doesn't apply well to declarative web3d syntax where nodes perisist for the life of the scene run. Labsound native library for web audio has no AudioBufferSourceNode - the one node its missing - due to the garbage collection behavior, and they've had no requests for it. So I can't test implementing BufferAudioSource via web audio AudioBufferSource and can't recommend either way.<o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>In native code via Labsound I'm able to implement BufferAudioSource the same way as AudioClip --Labsound SampledAudioSource which has detune and playbackRate, stop,start,loop-- and have that working in FreeWRL.<o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><o:p> </o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>ORIGINAL BUFFERAUDIOSOURCE<o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:Consolas'>BufferAudioSource : X3DSoundSourceNode, X3DUrlObject {</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:Consolas'>  SFTime   [in,out] autoRefresh           0.0        [0,∞)</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:Consolas'>  SFTime   [in,out] autoRefreshTimeLimit  3600.0     [0,∞)</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:Consolas'>  MFFloat  [in,out] buffer                []         [−1,1]</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:Consolas'>  SFTime   [in,out] bufferDuration        0          [0,∞)</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:Consolas'>  SFString [in,out] channelCountMode      "max"      ["max", "clamped-max", "explicit"]</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:Consolas'>  SFString [in,out] channelInterpretation "speakers" ["speakers", "discrete"]</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:Consolas'>  SFString [in,out] description           ""  </span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:Consolas'>  SFFloat  [in,out] detune                0          [0,∞)</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:Consolas'>  SFBool   [in,out] enabled               TRUE</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:Consolas'>  SFFloat  [in,out] gain                  1          (-∞,∞)</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:Consolas'>  SFBool   [in,out] load                  TRUE  </span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:Consolas'>  SFBool   [in,out] loop                  FALSE  </span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:Consolas'>  SFTime   [in,out] loopEnd               0          [0,∞)</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:Consolas'>  SFTime   [in,out] loopStart             0          [0,∞)</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:Consolas'>  SFNode   [in,out] metadata              NULL       [X3DMetadataObject]</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:Consolas'>  SFInt32  [in,out] numberOfChannels      0          [0,∞)</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:Consolas'>  SFTime   [in,out] pauseTime             0          (-∞,∞)</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:Consolas'>  SFFloat  [in,out] playbackRate          1          (-∞,∞)</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:Consolas'>  SFTime   [in,out] resumeTime            0          (-∞,∞)</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:Consolas'>  SFFloat  [in,out] sampleRate            0          [0,∞)</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:Consolas'>  SFTime   [in,out] startTime             0          (-∞,∞)</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:Consolas'>  SFTime   [in,out] stopTime              0          (-∞,∞)</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:Consolas'>  MFString [in,out] url                   []         [URI]</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:Consolas'>  SFInt32  [out]    bufferLength          0          [0,∞)</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:Consolas'>  SFInt32  [out]    channelCount                     [0,∞)</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:Consolas'>  SFTime   [out]    elapsedTime</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:Consolas'>  SFBool   [out]    isActive</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:Consolas'>  SFBool   [out]    isPaused</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:Consolas'>}</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>/ORIGINAL BUFFERAUDIOSOURCE<o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>REFACTORED BUFFERAUDIOSOURCE<o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:Consolas'>AudioBufferSource : X3DSoundSourceNode {</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:Consolas'>  SFNode   [in,out] buffer                NULL       [AudioBuffer]</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:Consolas'>  SFString [in,out] channelCountMode      "max"      ["max", "clamped-max", "explicit"]</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:Consolas'>  SFString [in,out] channelInterpretation "speakers" ["speakers", "discrete"]</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:Consolas'>  SFString [in,out] description           ""  </span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:Consolas'>  SFFloat  [in,out] detune                0          [0,∞)</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:Consolas'>  SFBool   [in,out] enabled               TRUE</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:Consolas'>  SFBool   [in,out] loop                  FALSE  </span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:Consolas'>  SFTime   [in,out] loopEnd               0          [0,∞)</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:Consolas'>  SFTime   [in,out] loopStart             0          [0,∞)</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:Consolas'>  SFNode   [in,out] metadata              NULL       [X3DMetadataObject]</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:Consolas'>  SFTime   [in,out] pauseTime             0          (-∞,∞)</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:Consolas'>  SFFloat  [in,out] playbackRate          1          (-∞,∞)</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:Consolas'>  SFTime   [in,out] resumeTime            0          (-∞,∞)</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:Consolas'>  SFTime   [in,out] startTime             0          (-∞,∞)</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:Consolas'>  SFTime   [in,out] stopTime              0          (-∞,∞)</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:Consolas'>  SFTime   [out]    elapsedTime</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:Consolas'>  SFBool   [out]    isActive</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:Consolas'>  SFBool   [out]    isPaused</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:Consolas'>}</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>/REFACTORED BUFFERAUDIOSOURCE<o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>AUDIOBUFFER<o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:Consolas'>BufferAudioSource : X3DUrlObject {</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:Consolas'>  SFTime   [in,out] autoRefresh           0.0        [0,∞)</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:Consolas'>  SFTime   [in,out] autoRefreshTimeLimit  3600.0     [0,∞)</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:Consolas'>  MFFloat  [in,out] bufferData            []         [−1,1]</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:Consolas'>  SFInt32  [in,out] bufferChannels        1          [0,∞)</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:Consolas'>  SFString [in,out] channelCountMode      "max"      ["max", "clamped-max", "explicit"]</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:Consolas'>  SFString [in,out] channelInterpretation "speakers" ["speakers", "discrete"]</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:Consolas'>  SFString [in,out] description           ""  </span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:Consolas'>  SFBool   [in,out] load                  TRUE  </span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:Consolas'>  SFNode   [in,out] metadata              NULL       [X3DMetadataObject]</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:Consolas'>  SFFloat  [in,out] sampleRate            0          [0,∞)</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:Consolas'>  MFString [in,out] url                   []         [URI]</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:Consolas'>  SFInt32  [out]    bufferLength          0          [0,∞)</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:Consolas'>  SFInt32  [out]    channelCount                     [0,∞)</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:Consolas'>}</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'> <o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>Note on field names bufferData and bufferChannels<o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>- web audio uses numberOfChannels as does current BufferAudioNode<o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>- but its not clear numberOfChannels only applies the the raw PCM32 data -- not to the URL loaded .wav file which will get its channel count from the .wav file.<o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>- to make the association clearer I recommend the names for buffer data and channel count have the same prefix, so will be sequential in specs alphabetically listed fields <o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>/AUDIOBUFFER<o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><o:p> </o:p></p></div></div></div></div></body></html>