V2.97a.20130512 - multiShot for polyphonic HTML5 clients. createSound() no longer requires an id. Auto-reboot() into 100% HTML5 mode where supported. HTML5 unload tweaks. Bug fixes Init enhancement: If preferFlash: true but useFlashBlock: false (the default SM2 config) and flash timeout / blocked case occurs, SM2 will reboot reboot into 100% HTML5 mode if available so init can succeed. If flash block handling is enabled, user interaction will be required to whitelist the flash movie and init will be delayed until the SWF loads. Correct reboot() to allow 100% HTML5 mode when Flash was previously required due to preferFlash: true. Previously, soundManager.audioFormats.mp3.required = false; soundManager.reboot() did not result in 100% HTML5 mode under Firefox. Now works as expected. HTML5 unloading: Firefox was supposed to like assigning '' to Audio().url for canceling requests, unloading and destroying the decoder (perhaps only on <audio>, in retrospect?) - similarly, .src = null did not seem to work, possible request to ./ - undesirable. Now using more-conservative null URL for unload / destruct on webkit, iOS and others, and emptyURL for Firefox (user-customizable, 'about:blank' by default.) More HTML5 safety checks so that buffered can't go beyond 100%. Improve Flash 9 load() -> onload() failure case, when loading a non-404 (eg., HTTP 301 -> 200) with non-audio content. Improved messaging for Flash 8, Flash 9 + HTML5 with zero-duration (invalid / unsupported sound) case. Fix flash-only (no HTML5 / useHTML5Audio: false) init case, e.g., running under IE 8. HTML5: Fix legacy "overloaded" case when soundManager.play('someID', 'some.mp3'); is called twice, second call would fail. This shortcut method is deprecated, and not recommended for use other than a conveience when in development / testing. API Updates createSound() no longer requires an id property. If omitted, a unique id will automatically be generated for the new sound object with a prefix based on the SM2 setup option idPrefix. Specifying an id is useful if you want to look up the sound via getSoundById() - otherwise, you can simply use the object returned by the createSound() call. multiShot + multiShotEvents for HTML5 Audio()-based sounds, allowing layered / "chorused" playback if play() is called and multiShot: true has been specified to either createSound() or play(). Behaviour should mimic that of Flash 9. If multiShotEvents: true is specified, onfinish() will fire for each instance. Does not apply to mobile clients (e.g., iOS and Android) which only allow one sound to be played at a time. Implementation summary: A new Audio(src) instance is created with an onfinish listener, and played immediately. It is unloaded and destroyed when playback finishes. Caveat #1: If a position argument is provided eg., play({ position: 1000 }), the cloned Audio() instance must wait for a HTML5 canplay event before a seek and playback can begin. This may mean playback *could* have a slight delay vs. playing without the position offset. Caveat #2: The from/to parameters used for "sound sprites", e.g., { from: 500, to: 1500 }, are not presently supported under multiShot. Caveat #3: multiShot is not supported where only a single audio instance can be playing at once, e.g., iOS (iPhone/iPad) and some Android devices. Secondary instances are "fire-and-forget", similar to the Flash 9 implementation, and fire no events other than onfinish(). They do not respond to position, volume etc. after playback has begun. Miscellaneous Remove debug-related complain() calls from -nodebug and minified script builds Force data: URLs over to HTML5. Catch unsupported case under 100% HTML5 mode, preventing attempt to use Flash fallback. Edge case: Fix error case if setup() called without arguments inline, before DOMReady / init etc. Tweak soundManager.getSoundById() to not throw error if ID omitted. Improve language on "not found" messaging. Warn on possible 32-sound channel Flash ceiling/limit, which can occur when Flash tries to begin playback and fails to start. Documentation updates: How Clients Download Audio (Flash/HTML5 progressive download vs. byte streaming) Improved API Examples page design, two-column layout with navigation