Hi Team,
Thanks for helping me out and providing guidance. I have successfully added flash support to play Audio in IE. Thanks and Regards, Amarjeet Singh On Wed, Nov 15, 2017 at 10:09 PM, Frode Langelo <[email protected]> wrote: > Hi Amarjeet, > > Were you able to get your code demo to work? If not, what if you avoid > using SWFObject and instead just embed the swf in the HTML to get > going? > It may be more fruitful to reach out to a Flash forum as the members > there would be more experienced in this. > > Kind regards, > Frode > > On Wed, Nov 15, 2017 at 8:01 AM, Amarjeet Singh <[email protected]> > wrote: > > Hi Frode, > > > > If there would be any update on the above please let me know. > > > > I have looked into the following to get more into action script :- > > > > *http://doc.neolao.com/as3_langref/flash/events/SampleDataEvent.html* > >> <http://doc.neolao.com/as3_langref/flash/events/SampleDataEvent.html> > > > > > > > >> *https://help.adobe.com/en_US/as3/dev/WSE523B839-C626-4983- > B9C0-07CF1A087ED7.html > >> <https://help.adobe.com/en_US/as3/dev/WSE523B839-C626-4983- > B9C0-07CF1A087ED7.html>* > > > > > >> *http://philippseifried.com/blog/2011/10/13/dynamic-audio- > in-as3-part-2-basics/ > >> <http://philippseifried.com/blog/2011/10/13/dynamic-audio- > in-as3-part-2-basics/> > >> = Explains how writeFloat works and play sound using Flash* > > > > > > > > If anyone wants to look into it. > > > > > > Thanks and Regards, > > Amarjeet Singh > > > > On Tue, Nov 14, 2017 at 2:02 PM, Amarjeet Singh <[email protected]> > > wrote: > > > >> Link which helped to understand are as follows :- > >>> > >>> > >>> > >>> *https://code.tutsplus.com/tutorials/beginning-audio- > programming-in-as3--active-10579* > >>> <https://code.tutsplus.com/tutorials/beginning-audio- > programming-in-as3--active-10579> > >> > >> > >> *http://www.republicofcode.com/tutorials/flash/as3sound/ > >>> <http://www.republicofcode.com/tutorials/flash/as3sound/>* > >> > >> > >> > >> > >>> *http://learnswfobject.com/the-basics/index.html > >>> <http://learnswfobject.com/the-basics/index.html>* > >> > >> > >> On Tue, Nov 14, 2017 at 1:55 PM, Amarjeet Singh <[email protected]> > >> wrote: > >> > >>> Hi Frode, > >>> > >>> > >>> I have tried the following code as demo :- > >>> > >>> > >>> *Sample 1 of Action Script code is as follows ( guacamole.swf ) :-* > >>> > >>> package > >>>> { > >>>> import flash.display.*; > >>>> import flash.events.*; > >>>> import flash.external.*; > >>>> import flash.media.*; > >>>> public class guacamole extends Sprite > >>>> { > >>>> public var bufferSize:Number = 2048; > >>>> public var sound:Sound = null; > >>>> public var buffer:Array; > >>>> public function guacamole() > >>>> { > >>>> this.buffer = []; > >>>> super(); > >>>> ExternalInterface.addCallback("write", this.write); > >>>> } > >>>> public function write(param1:String) : void > >>>> { > >>>> var _loc_3:String = null; > >>>> if(!this.sound) > >>>> { > >>>> this.sound = new Sound(); > >>>> this.sound.addEventListener(SampleDataEvent.SAMPLE_DATA, > >>>> this.waveGenerator); > >>>> this.sound.play(); > >>>> } > >>>> var _loc_2:Number = 1 / 32768; > >>>> var _loc_4:* = 0; > >>>> var _loc_5:* = param1.split(" "); > >>>> for each(_loc_3 in _loc_5) > >>>> { > >>>> this.buffer.push(Number(_loc_3) * _loc_2); > >>>> } > >>>> } > >>>> public function waveGenerator(param1:SampleDataEvent) : void > >>>> { > >>>> var _loc_2:* = 0; > >>>> var _loc_4:* = NaN; > >>>> if(this.buffer.length < (this.bufferSize * 2)) > >>>> { > >>>> _loc_2 = 0; > >>>> while(_loc_2 < 4096) > >>>> { > >>>> param1.data.writeFloat(0.00); > >>>> _loc_2++; > >>>> } > >>>> return; > >>>> } > >>>> var _loc_3:Number = Math.min(this.buffer.length, 16384); > >>>> var _loc_5:* = 0; > >>>> var _loc_6:* = this.buffer.slice(0, _loc_3); > >>>> for each(_loc_4 in _loc_6) > >>>> { > >>>> param1.data.writeFloat(_loc_4); > >>>> } > >>>> this.buffer = this.buffer.slice(_loc_3, this.buffer.length); > >>>> } > >>>> } > >>>> } > >>> > >>> > >>> *Sample 2 of Action Script code is as follows ( guacamole.swf ) :- > // > >>> with few changes * > >>> > >>> package > >>>> { > >>>> import flash.display.*; > >>>> import flash.events.*; > >>>> import flash.external.*; > >>>> import flash.media.*; > >>>> public class guacamole extends Sprite > >>>> { > >>>> public var sound:Sound = null; > >>>> public var buffer:Array; > >>>> public function guacamole() > >>>> { > >>>> this.buffer = []; > >>>> super(); > >>>> ExternalInterface.addCallback("write", this.write); > >>>> } > >>>> public function write(param1:String) : void > >>>> { > >>>> if(!this.sound) > >>>> { > >>>> this.sound = new Sound(); > >>>> this.sound.addEventListener(SampleDataEvent.SAMPLE_DATA, > >>>> this.waveGenerator); > >>>> this.sound.play(); > >>>> } > >>>> this.buffer = this.buffer.concat(param1.split(",")); > >>>> } > >>>> public function waveGenerator(param1:SampleDataEvent) : void > >>>> { > >>>> var _loc_2:int = 0; > >>>> var _loc_3:Function = param1.data.writeFloat; > >>>> if(this.buffer.length < 4096) > >>>> { > >>>> _loc_2 = 0; > >>>> while(_loc_2 < 4096) > >>>> { > >>>> _loc_3(0.00); > >>>> _loc_2++; > >>>> } > >>>> return; > >>>> } > >>>> var _loc_4:Number = Math.min(this.buffer.length, 16384); > >>>> _loc_2 = 0; > >>>> while(_loc_2 < _loc_4) > >>>> { > >>>> _loc_3(this.buffer[_loc_2]); > >>>> _loc_2++; > >>>> } > >>>> this.buffer = this.buffer.slice(_loc_4, this.buffer.length); > >>>> } > >>>> } > >>>> } > >>> > >>> > >>> > >>> *Code of SWFObject is as follows : // you can get it online as well * * > https://github.com/swfobject/swfobject > >>> <https://github.com/swfobject/swfobject>* > >>> > >>> /*! SWFObject v2.2 <http://code.google.com/p/swfobject/> > >>>> is released under the MIT License <http://www.opensource.org/lic > >>>> enses/mit-license.php> > >>>> */ > >>>> var swfobject = function() { > >>>> > >>>> var UNDEF = "undefined", > >>>> OBJECT = "object", > >>>> SHOCKWAVE_FLASH = "Shockwave Flash", > >>>> SHOCKWAVE_FLASH_AX = "ShockwaveFlash.ShockwaveFlash", > >>>> FLASH_MIME_TYPE = "application/x-shockwave-flash", > >>>> EXPRESS_INSTALL_ID = "SWFObjectExprInst", > >>>> ON_READY_STATE_CHANGE = "onreadystatechange", > >>>> > >>>> win = window, > >>>> doc = document, > >>>> nav = navigator, > >>>> > >>>> plugin = false, > >>>> domLoadFnArr = [main], > >>>> regObjArr = [], > >>>> objIdArr = [], > >>>> listenersArr = [], > >>>> storedAltContent, > >>>> storedAltContentId, > >>>> storedCallbackFn, > >>>> storedCallbackObj, > >>>> isDomLoaded = false, > >>>> isExpressInstallActive = false, > >>>> dynamicStylesheet, > >>>> dynamicStylesheetMedia, > >>>> autoHideShow = true, > >>>> > >>>> /* Centralized function for browser feature detection > >>>> - User agent string detection is only used when no good alternative is > >>>> possible > >>>> - Is executed directly for optimal performance > >>>> */ > >>>> ua = function() { > >>>> var w3cdom = typeof doc.getElementById != UNDEF && typeof > >>>> doc.getElementsByTagName != UNDEF && typeof doc.createElement != > UNDEF, > >>>> u = nav.userAgent.toLowerCase(), > >>>> p = nav.platform.toLowerCase(), > >>>> windows = p ? /win/.test(p) : /win/.test(u), > >>>> mac = p ? /mac/.test(p) : /mac/.test(u), > >>>> webkit = /webkit/.test(u) ? parseFloat(u.replace(/^.* > webkit\/(\d+(\.\d+)?).*$/, > >>>> "$1")) : false, // returns either the webkit version or false if not > webkit > >>>> ie = !+"\v1", // feature detection based on Andrea Giammarchi's > >>>> solution: http://webreflection.blogspot. > com/2009/01/32-bytes-to-know-i > >>>> f-your-browser-is-ie.html > >>>> playerVersion = [0,0,0], > >>>> d = null; > >>>> if (typeof nav.plugins != UNDEF && typeof nav.plugins[SHOCKWAVE_FLASH] > >>>> == OBJECT) { > >>>> d = nav.plugins[SHOCKWAVE_FLASH].description; > >>>> if (d && !(typeof nav.mimeTypes != UNDEF && > >>>> nav.mimeTypes[FLASH_MIME_TYPE] && !nav.mimeTypes[FLASH_MIME_ > TYPE].enabledPlugin)) > >>>> { // navigator.mimeTypes["application/x-shockwave-flash" > ].enabledPlugin > >>>> indicates whether plug-ins are enabled or disabled in Safari 3+ > >>>> plugin = true; > >>>> ie = false; // cascaded feature detection for Internet Explorer > >>>> d = d.replace(/^.*\s+(\S+\s+\S+$)/, "$1"); > >>>> playerVersion[0] = parseInt(d.replace(/^(.*)\..*$/, "$1"), 10); > >>>> playerVersion[1] = parseInt(d.replace(/^.*\.(.*)\s.*$/, "$1"), 10); > >>>> playerVersion[2] = /[a-zA-Z]/.test(d) ? parseInt(d.replace(/^.*[a-zA- > Z]+(.*)$/, > >>>> "$1"), 10) : 0; > >>>> } > >>>> } > >>>> else if (typeof win.ActiveXObject != UNDEF) { > >>>> try { > >>>> var a = new ActiveXObject(SHOCKWAVE_FLASH_AX); > >>>> if (a) { // a will return null when ActiveX is disabled > >>>> d = a.GetVariable("$version"); > >>>> if (d) { > >>>> ie = true; // cascaded feature detection for Internet Explorer > >>>> d = d.split(" ")[1].split(","); > >>>> playerVersion = [parseInt(d[0], 10), parseInt(d[1], 10), > parseInt(d[2], > >>>> 10)]; > >>>> } > >>>> } > >>>> } > >>>> catch(e) {} > >>>> } > >>>> return { w3:w3cdom, pv:playerVersion, wk:webkit, ie:ie, win:windows, > >>>> mac:mac }; > >>>> }(), > >>>> > >>>> /* Cross-browser onDomLoad > >>>> - Will fire an event as soon as the DOM of a web page is loaded > >>>> - Internet Explorer workaround based on Diego Perini's solution: > >>>> http://javascript.nwbox.com/IEContentLoaded/ > >>>> - Regular onload serves as fallback > >>>> */ > >>>> onDomLoad = function() { > >>>> if (!ua.w3) { return; } > >>>> if ((typeof doc.readyState != UNDEF && doc.readyState == "complete") > || > >>>> (typeof doc.readyState == UNDEF && (doc.getElementsByTagName(" > body")[0] > >>>> || doc.body))) { // function is fired after onload, e.g. when script > is > >>>> inserted dynamically > >>>> callDomLoadFunctions(); > >>>> } > >>>> if (!isDomLoaded) { > >>>> if (typeof doc.addEventListener != UNDEF) { > >>>> doc.addEventListener("DOMContentLoaded", callDomLoadFunctions, > false); > >>>> } > >>>> if (ua.ie && ua.win) { > >>>> doc.attachEvent(ON_READY_STATE_CHANGE, function() { > >>>> if (doc.readyState == "complete") { > >>>> doc.detachEvent(ON_READY_STATE_CHANGE, arguments.callee); > >>>> callDomLoadFunctions(); > >>>> } > >>>> }); > >>>> if (win == top) { // if not inside an iframe > >>>> (function(){ > >>>> if (isDomLoaded) { return; } > >>>> try { > >>>> doc.documentElement.doScroll("left"); > >>>> } > >>>> catch(e) { > >>>> setTimeout(arguments.callee, 0); > >>>> return; > >>>> } > >>>> callDomLoadFunctions(); > >>>> })(); > >>>> } > >>>> } > >>>> if (ua.wk) { > >>>> (function(){ > >>>> if (isDomLoaded) { return; } > >>>> if (!/loaded|complete/.test(doc.readyState)) { > >>>> setTimeout(arguments.callee, 0); > >>>> return; > >>>> } > >>>> callDomLoadFunctions(); > >>>> })(); > >>>> } > >>>> addLoadEvent(callDomLoadFunctions); > >>>> } > >>>> }(); > >>>> > >>>> function callDomLoadFunctions() { > >>>> if (isDomLoaded) { return; } > >>>> try { // test if we can really add/remove elements to/from the DOM; we > >>>> don't want to fire it too early > >>>> var t = doc.getElementsByTagName("body")[0].appendChild(createElemen > >>>> t("span")); > >>>> t.parentNode.removeChild(t); > >>>> } > >>>> catch (e) { return; } > >>>> isDomLoaded = true; > >>>> var dl = domLoadFnArr.length; > >>>> for (var i = 0; i < dl; i++) { > >>>> domLoadFnArr[i](); > >>>> } > >>>> } > >>>> > >>>> function addDomLoadEvent(fn) { > >>>> if (isDomLoaded) { > >>>> fn(); > >>>> } > >>>> else { > >>>> domLoadFnArr[domLoadFnArr.length] = fn; // Array.push() is only > >>>> available in IE5.5+ > >>>> } > >>>> } > >>>> > >>>> /* Cross-browser onload > >>>> - Based on James Edwards' solution: http://brothercake.com/site/re > >>>> sources/scripts/onload/ > >>>> - Will fire an event as soon as a web page including all of its assets > >>>> are loaded > >>>> */ > >>>> function addLoadEvent(fn) { > >>>> if (typeof win.addEventListener != UNDEF) { > >>>> win.addEventListener("load", fn, false); > >>>> } > >>>> else if (typeof doc.addEventListener != UNDEF) { > >>>> doc.addEventListener("load", fn, false); > >>>> } > >>>> else if (typeof win.attachEvent != UNDEF) { > >>>> addListener(win, "onload", fn); > >>>> } > >>>> else if (typeof win.onload == "function") { > >>>> var fnOld = win.onload; > >>>> win.onload = function() { > >>>> fnOld(); > >>>> fn(); > >>>> }; > >>>> } > >>>> else { > >>>> win.onload = fn; > >>>> } > >>>> } > >>>> > >>>> /* Main function > >>>> - Will preferably execute onDomLoad, otherwise onload (as a fallback) > >>>> */ > >>>> function main() { > >>>> if (plugin) { > >>>> testPlayerVersion(); > >>>> } > >>>> else { > >>>> matchVersions(); > >>>> } > >>>> } > >>>> > >>>> /* Detect the Flash Player version for non-Internet Explorer browsers > >>>> - Detecting the plug-in version via the object element is more precise > >>>> than using the plugins collection item's description: > >>>> a. Both release and build numbers can be detected > >>>> b. Avoid wrong descriptions by corrupt installers provided by Adobe > >>>> c. Avoid wrong descriptions by multiple Flash Player entries in the > >>>> plugin Array, caused by incorrect browser imports > >>>> - Disadvantage of this method is that it depends on the availability > of > >>>> the DOM, while the plugins collection is immediately available > >>>> */ > >>>> function testPlayerVersion() { > >>>> var b = doc.getElementsByTagName("body")[0]; > >>>> var o = createElement(OBJECT); > >>>> o.setAttribute("type", FLASH_MIME_TYPE); > >>>> var t = b.appendChild(o); > >>>> if (t) { > >>>> var counter = 0; > >>>> (function(){ > >>>> if (typeof t.GetVariable != UNDEF) { > >>>> var d = t.GetVariable("$version"); > >>>> if (d) { > >>>> d = d.split(" ")[1].split(","); > >>>> ua.pv = [parseInt(d[0], 10), parseInt(d[1], 10), parseInt(d[2], 10)]; > >>>> } > >>>> } > >>>> else if (counter < 10) { > >>>> counter++; > >>>> setTimeout(arguments.callee, 10); > >>>> return; > >>>> } > >>>> b.removeChild(o); > >>>> t = null; > >>>> matchVersions(); > >>>> })(); > >>>> } > >>>> else { > >>>> matchVersions(); > >>>> } > >>>> } > >>>> > >>>> /* Perform Flash Player and SWF version matching; static publishing > only > >>>> */ > >>>> function matchVersions() { > >>>> var rl = regObjArr.length; > >>>> if (rl > 0) { > >>>> for (var i = 0; i < rl; i++) { // for each registered object element > >>>> var id = regObjArr[i].id; > >>>> var cb = regObjArr[i].callbackFn; > >>>> var cbObj = {success:false, id:id}; > >>>> if (ua.pv[0] > 0) { > >>>> var obj = getElementById(id); > >>>> if (obj) { > >>>> if (hasPlayerVersion(regObjArr[i].swfVersion) && !(ua.wk && ua.wk < > >>>> 312)) { // Flash Player version >= published SWF version: Houston, we > have > >>>> a match! > >>>> setVisibility(id, true); > >>>> if (cb) { > >>>> cbObj.success = true; > >>>> cbObj.ref = getObjectById(id); > >>>> cb(cbObj); > >>>> } > >>>> } > >>>> else if (regObjArr[i].expressInstall && canExpressInstall()) { // show > >>>> the Adobe Express Install dialog if set by the web page author and if > >>>> supported > >>>> var att = {}; > >>>> att.data = regObjArr[i].expressInstall; > >>>> att.width = obj.getAttribute("width") || "0"; > >>>> att.height = obj.getAttribute("height") || "0"; > >>>> if (obj.getAttribute("class")) { att.styleclass = > >>>> obj.getAttribute("class"); } > >>>> if (obj.getAttribute("align")) { att.align = > obj.getAttribute("align"); } > >>>> // parse HTML object param element's name-value pairs > >>>> var par = {}; > >>>> var p = obj.getElementsByTagName("param"); > >>>> var pl = p.length; > >>>> for (var j = 0; j < pl; j++) { > >>>> if (p[j].getAttribute("name").toLowerCase() != "movie") { > >>>> par[p[j].getAttribute("name")] = p[j].getAttribute("value"); > >>>> } > >>>> } > >>>> showExpressInstall(att, par, id, cb); > >>>> } > >>>> else { // Flash Player and SWF version mismatch or an older Webkit > >>>> engine that ignores the HTML object element's nested param elements: > >>>> display alternative content instead of SWF > >>>> displayAltContent(obj); > >>>> if (cb) { cb(cbObj); } > >>>> } > >>>> } > >>>> } > >>>> else { // if no Flash Player is installed or the fp version cannot be > >>>> detected we let the HTML object element do its job (either show a SWF > or > >>>> alternative content) > >>>> setVisibility(id, true); > >>>> if (cb) { > >>>> var o = getObjectById(id); // test whether there is an HTML object > >>>> element or not > >>>> if (o && typeof o.SetVariable != UNDEF) { > >>>> cbObj.success = true; > >>>> cbObj.ref = o; > >>>> } > >>>> cb(cbObj); > >>>> } > >>>> } > >>>> } > >>>> } > >>>> } > >>>> > >>>> function getObjectById(objectIdStr) { > >>>> var r = null; > >>>> var o = getElementById(objectIdStr); > >>>> if (o && o.nodeName == "OBJECT") { > >>>> if (typeof o.SetVariable != UNDEF) { > >>>> r = o; > >>>> } > >>>> else { > >>>> var n = o.getElementsByTagName(OBJECT)[0]; > >>>> if (n) { > >>>> r = n; > >>>> } > >>>> } > >>>> } > >>>> return r; > >>>> } > >>>> > >>>> /* Requirements for Adobe Express Install > >>>> - only one instance can be active at a time > >>>> - fp 6.0.65 or higher > >>>> - Win/Mac OS only > >>>> - no Webkit engines older than version 312 > >>>> */ > >>>> function canExpressInstall() { > >>>> return !isExpressInstallActive && hasPlayerVersion("6.0.65") && > (ua.win > >>>> || ua.mac) && !(ua.wk && ua.wk < 312); > >>>> } > >>>> > >>>> /* Show the Adobe Express Install dialog > >>>> - Reference: http://www.adobe.com/cfusion/k > >>>> nowledgebase/index.cfm?id=6a253b75 > >>>> */ > >>>> function showExpressInstall(att, par, replaceElemIdStr, callbackFn) { > >>>> isExpressInstallActive = true; > >>>> storedCallbackFn = callbackFn || null; > >>>> storedCallbackObj = {success:false, id:replaceElemIdStr}; > >>>> var obj = getElementById(replaceElemIdStr); > >>>> if (obj) { > >>>> if (obj.nodeName == "OBJECT") { // static publishing > >>>> storedAltContent = abstractAltContent(obj); > >>>> storedAltContentId = null; > >>>> } > >>>> else { // dynamic publishing > >>>> storedAltContent = obj; > >>>> storedAltContentId = replaceElemIdStr; > >>>> } > >>>> att.id = EXPRESS_INSTALL_ID; > >>>> if (typeof att.width == UNDEF || (!/%$/.test(att.width) && > >>>> parseInt(att.width, 10) < 310)) { att.width = "310"; } > >>>> if (typeof att.height == UNDEF || (!/%$/.test(att.height) && > >>>> parseInt(att.height, 10) < 137)) { att.height = "137"; } > >>>> doc.title = doc.title.slice(0, 47) + " - Flash Player Installation"; > >>>> var pt = ua.ie && ua.win ? "ActiveX" : "PlugIn", > >>>> fv = "MMredirectURL=" + win.location.toString().replace(/&/g,"%26") + > >>>> "&MMplayerType=" + pt + "&MMdoctitle=" + doc.title; > >>>> if (typeof par.flashvars != UNDEF) { > >>>> par.flashvars += "&" + fv; > >>>> } > >>>> else { > >>>> par.flashvars = fv; > >>>> } > >>>> // IE only: when a SWF is loading (AND: not available in cache) wait > for > >>>> the readyState of the object element to become 4 before removing it, > >>>> // because you cannot properly cancel a loading SWF file without > >>>> breaking browser load references, also obj.onreadystatechange doesn't > work > >>>> if (ua.ie && ua.win && obj.readyState != 4) { > >>>> var newObj = createElement("div"); > >>>> replaceElemIdStr += "SWFObjectNew"; > >>>> newObj.setAttribute("id", replaceElemIdStr); > >>>> obj.parentNode.insertBefore(newObj, obj); // insert placeholder div > >>>> that will be replaced by the object element that loads > expressinstall.swf > >>>> obj.style.display = "none"; > >>>> (function(){ > >>>> if (obj.readyState == 4) { > >>>> obj.parentNode.removeChild(obj); > >>>> } > >>>> else { > >>>> setTimeout(arguments.callee, 10); > >>>> } > >>>> })(); > >>>> } > >>>> createSWF(att, par, replaceElemIdStr); > >>>> } > >>>> } > >>>> > >>>> /* Functions to abstract and display alternative content > >>>> */ > >>>> function displayAltContent(obj) { > >>>> if (ua.ie && ua.win && obj.readyState != 4) { > >>>> // IE only: when a SWF is loading (AND: not available in cache) wait > for > >>>> the readyState of the object element to become 4 before removing it, > >>>> // because you cannot properly cancel a loading SWF file without > >>>> breaking browser load references, also obj.onreadystatechange doesn't > work > >>>> var el = createElement("div"); > >>>> obj.parentNode.insertBefore(el, obj); // insert placeholder div that > >>>> will be replaced by the alternative content > >>>> el.parentNode.replaceChild(abstractAltContent(obj), el); > >>>> obj.style.display = "none"; > >>>> (function(){ > >>>> if (obj.readyState == 4) { > >>>> obj.parentNode.removeChild(obj); > >>>> } > >>>> else { > >>>> setTimeout(arguments.callee, 10); > >>>> } > >>>> })(); > >>>> } > >>>> else { > >>>> obj.parentNode.replaceChild(abstractAltContent(obj), obj); > >>>> } > >>>> } > >>>> function abstractAltContent(obj) { > >>>> var ac = createElement("div"); > >>>> if (ua.win && ua.ie) { > >>>> ac.innerHTML = obj.innerHTML; > >>>> } > >>>> else { > >>>> var nestedObj = obj.getElementsByTagName(OBJECT)[0]; > >>>> if (nestedObj) { > >>>> var c = nestedObj.childNodes; > >>>> if (c) { > >>>> var cl = c.length; > >>>> for (var i = 0; i < cl; i++) { > >>>> if (!(c[i].nodeType == 1 && c[i].nodeName == "PARAM") && > !(c[i].nodeType > >>>> == 8)) { > >>>> ac.appendChild(c[i].cloneNode(true)); > >>>> } > >>>> } > >>>> } > >>>> } > >>>> } > >>>> return ac; > >>>> } > >>>> > >>>> /* Cross-browser dynamic SWF creation > >>>> */ > >>>> function createSWF(attObj, parObj, id) { > >>>> var r, el = getElementById(id); > >>>> if (ua.wk && ua.wk < 312) { return r; } > >>>> if (el) { > >>>> if (typeof attObj.id == UNDEF) { // if no 'id' is defined for the > object > >>>> element, it will inherit the 'id' from the alternative content > >>>> attObj.id = id; > >>>> } > >>>> if (ua.ie && ua.win) { // Internet Explorer + the HTML object > element + > >>>> W3C DOM methods do not combine: fall back to outerHTML > >>>> var att = ""; > >>>> for (var i in attObj) { > >>>> if (attObj[i] != Object.prototype[i]) { // filter out prototype > >>>> additions from other potential libraries > >>>> if (i.toLowerCase() == "data") { > >>>> parObj.movie = attObj[i]; > >>>> } > >>>> else if (i.toLowerCase() == "styleclass") { // 'class' is an ECMA4 > >>>> reserved keyword > >>>> att += ' class="' + attObj[i] + '"'; > >>>> } > >>>> else if (i.toLowerCase() != "classid") { > >>>> att += ' ' + i + '="' + attObj[i] + '"'; > >>>> } > >>>> } > >>>> } > >>>> var par = ""; > >>>> for (var j in parObj) { > >>>> if (parObj[j] != Object.prototype[j]) { // filter out prototype > >>>> additions from other potential libraries > >>>> par += '<param name="' + j + '" value="' + parObj[j] + '" />'; > >>>> } > >>>> } > >>>> el.outerHTML = '<object classid="clsid:D27CDB6E-AE6D- > 11cf-96B8-444553540000"' > >>>> + att + '>' + par + '</object>'; > >>>> objIdArr[objIdArr.length] = attObj.id; // stored to fix object 'leaks' > >>>> on unload (dynamic publishing only) > >>>> r = getElementById(attObj.id); > >>>> } > >>>> else { // well-behaving browsers > >>>> var o = createElement(OBJECT); > >>>> o.setAttribute("type", FLASH_MIME_TYPE); > >>>> for (var m in attObj) { > >>>> if (attObj[m] != Object.prototype[m]) { // filter out prototype > >>>> additions from other potential libraries > >>>> if (m.toLowerCase() == "styleclass") { // 'class' is an ECMA4 reserved > >>>> keyword > >>>> o.setAttribute("class", attObj[m]); > >>>> } > >>>> else if (m.toLowerCase() != "classid") { // filter out IE specific > >>>> attribute > >>>> o.setAttribute(m, attObj[m]); > >>>> } > >>>> } > >>>> } > >>>> for (var n in parObj) { > >>>> if (parObj[n] != Object.prototype[n] && n.toLowerCase() != "movie") { > // > >>>> filter out prototype additions from other potential libraries and IE > >>>> specific param element > >>>> createObjParam(o, n, parObj[n]); > >>>> } > >>>> } > >>>> el.parentNode.replaceChild(o, el); > >>>> r = o; > >>>> } > >>>> } > >>>> return r; > >>>> } > >>>> > >>>> function createObjParam(el, pName, pValue) { > >>>> var p = createElement("param"); > >>>> p.setAttribute("name", pName); > >>>> p.setAttribute("value", pValue); > >>>> el.appendChild(p); > >>>> } > >>>> > >>>> /* Cross-browser SWF removal > >>>> - Especially needed to safely and completely remove a SWF in Internet > >>>> Explorer > >>>> */ > >>>> function removeSWF(id) { > >>>> var obj = getElementById(id); > >>>> if (obj && obj.nodeName == "OBJECT") { > >>>> if (ua.ie && ua.win) { > >>>> obj.style.display = "none"; > >>>> (function(){ > >>>> if (obj.readyState == 4) { > >>>> removeObjectInIE(id); > >>>> } > >>>> else { > >>>> setTimeout(arguments.callee, 10); > >>>> } > >>>> })(); > >>>> } > >>>> else { > >>>> obj.parentNode.removeChild(obj); > >>>> } > >>>> } > >>>> } > >>>> > >>>> function removeObjectInIE(id) { > >>>> var obj = getElementById(id); > >>>> if (obj) { > >>>> for (var i in obj) { > >>>> if (typeof obj[i] == "function") { > >>>> obj[i] = null; > >>>> } > >>>> } > >>>> obj.parentNode.removeChild(obj); > >>>> } > >>>> } > >>>> > >>>> /* Functions to optimize JavaScript compression > >>>> */ > >>>> function getElementById(id) { > >>>> var el = null; > >>>> try { > >>>> el = doc.getElementById(id); > >>>> } > >>>> catch (e) {} > >>>> return el; > >>>> } > >>>> > >>>> function createElement(el) { > >>>> return doc.createElement(el); > >>>> } > >>>> > >>>> /* Updated attachEvent function for Internet Explorer > >>>> - Stores attachEvent information in an Array, so on unload the > >>>> detachEvent functions can be called to avoid memory leaks > >>>> */ > >>>> function addListener(target, eventType, fn) { > >>>> target.attachEvent(eventType, fn); > >>>> listenersArr[listenersArr.length] = [target, eventType, fn]; > >>>> } > >>>> > >>>> /* Flash Player and SWF content version matching > >>>> */ > >>>> function hasPlayerVersion(rv) { > >>>> var pv = ua.pv, v = rv.split("."); > >>>> v[0] = parseInt(v[0], 10); > >>>> v[1] = parseInt(v[1], 10) || 0; // supports short notation, e.g. "9" > >>>> instead of "9.0.0" > >>>> v[2] = parseInt(v[2], 10) || 0; > >>>> return (pv[0] > v[0] || (pv[0] == v[0] && pv[1] > v[1]) || (pv[0] == > >>>> v[0] && pv[1] == v[1] && pv[2] >= v[2])) ? true : false; > >>>> } > >>>> > >>>> /* Cross-browser dynamic CSS creation > >>>> - Based on Bobby van der Sluis' solution: > http://www.bobbyvandersluis.co > >>>> m/articles/dynamicCSS.php > >>>> */ > >>>> function createCSS(sel, decl, media, newStyle) { > >>>> if (ua.ie && ua.mac) { return; } > >>>> var h = doc.getElementsByTagName("head")[0]; > >>>> if (!h) { return; } // to also support badly authored HTML pages that > >>>> lack a head element > >>>> var m = (media && typeof media == "string") ? media : "screen"; > >>>> if (newStyle) { > >>>> dynamicStylesheet = null; > >>>> dynamicStylesheetMedia = null; > >>>> } > >>>> if (!dynamicStylesheet || dynamicStylesheetMedia != m) { > >>>> // create dynamic stylesheet + get a global reference to it > >>>> var s = createElement("style"); > >>>> s.setAttribute("type", "text/css"); > >>>> s.setAttribute("media", m); > >>>> dynamicStylesheet = h.appendChild(s); > >>>> if (ua.ie && ua.win && typeof doc.styleSheets != UNDEF && > >>>> doc.styleSheets.length > 0) { > >>>> dynamicStylesheet = doc.styleSheets[doc.styleSheets.length - 1]; > >>>> } > >>>> dynamicStylesheetMedia = m; > >>>> } > >>>> // add style rule > >>>> if (ua.ie && ua.win) { > >>>> if (dynamicStylesheet && typeof dynamicStylesheet.addRule == OBJECT) { > >>>> dynamicStylesheet.addRule(sel, decl); > >>>> } > >>>> } > >>>> else { > >>>> if (dynamicStylesheet && typeof doc.createTextNode != UNDEF) { > >>>> dynamicStylesheet.appendChild(doc.createTextNode(sel + " {" + decl + > >>>> "}")); > >>>> } > >>>> } > >>>> } > >>>> > >>>> function setVisibility(id, isVisible) { > >>>> if (!autoHideShow) { return; } > >>>> var v = isVisible ? "visible" : "hidden"; > >>>> if (isDomLoaded && getElementById(id)) { > >>>> getElementById(id).style.visibility = v; > >>>> } > >>>> else { > >>>> createCSS("#" + id, "visibility:" + v); > >>>> } > >>>> } > >>>> /* Filter to avoid XSS attacks > >>>> */ > >>>> function urlEncodeIfNecessary(s) { > >>>> var regex = /[\\\"<>\.;]/; > >>>> var hasBadChars = regex.exec(s) != null; > >>>> return hasBadChars && typeof encodeURIComponent != UNDEF ? > >>>> encodeURIComponent(s) : s; > >>>> } > >>>> > >>>> /* Release memory to avoid memory leaks caused by closures, fix > hanging > >>>> audio/video threads and force open sockets/NetConnections to > disconnect > >>>> (Internet Explorer only) > >>>> */ > >>>> var cleanup = function() { > >>>> if (ua.ie && ua.win) { > >>>> window.attachEvent("onunload", function() { > >>>> // remove listeners to avoid memory leaks > >>>> var ll = listenersArr.length; > >>>> for (var i = 0; i < ll; i++) { > >>>> listenersArr[i][0].detachEvent(listenersArr[i][1], > listenersArr[i][2]); > >>>> } > >>>> // cleanup dynamically embedded objects to fix audio/video threads and > >>>> force open sockets and NetConnections to disconnect > >>>> var il = objIdArr.length; > >>>> for (var j = 0; j < il; j++) { > >>>> removeSWF(objIdArr[j]); > >>>> } > >>>> // cleanup library's main closures to avoid memory leaks > >>>> for (var k in ua) { > >>>> ua[k] = null; > >>>> } > >>>> ua = null; > >>>> for (var l in swfobject) { > >>>> swfobject[l] = null; > >>>> } > >>>> swfobject = null; > >>>> }); > >>>> } > >>>> }(); > >>>> > >>>> return { > >>>> /* Public API > >>>> - Reference: http://code.google.com/p/swfobject/wiki/documentation > >>>> */ > >>>> registerObject: function(objectIdStr, swfVersionStr, xiSwfUrlStr, > >>>> callbackFn) { > >>>> if (ua.w3 && objectIdStr && swfVersionStr) { > >>>> var regObj = {}; > >>>> regObj.id = objectIdStr; > >>>> regObj.swfVersion = swfVersionStr; > >>>> regObj.expressInstall = xiSwfUrlStr; > >>>> regObj.callbackFn = callbackFn; > >>>> regObjArr[regObjArr.length] = regObj; > >>>> setVisibility(objectIdStr, false); > >>>> } > >>>> else if (callbackFn) { > >>>> callbackFn({success:false, id:objectIdStr}); > >>>> } > >>>> }, > >>>> > >>>> getObjectById: function(objectIdStr) { > >>>> if (ua.w3) { > >>>> return getObjectById(objectIdStr); > >>>> } > >>>> }, > >>>> > >>>> embedSWF: function(swfUrlStr, replaceElemIdStr, widthStr, heightStr, > >>>> swfVersionStr, xiSwfUrlStr, flashvarsObj, parObj, attObj, callbackFn) > { > >>>> var callbackObj = {success:false, id:replaceElemIdStr}; > >>>> if (ua.w3 && !(ua.wk && ua.wk < 312) && swfUrlStr && replaceElemIdStr > && > >>>> widthStr && heightStr && swfVersionStr) { > >>>> setVisibility(replaceElemIdStr, false); > >>>> addDomLoadEvent(function() { > >>>> widthStr += ""; // auto-convert to string > >>>> heightStr += ""; > >>>> var att = {}; > >>>> if (attObj && typeof attObj === OBJECT) { > >>>> for (var i in attObj) { // copy object to avoid the use of references, > >>>> because web authors often reuse attObj for multiple SWFs > >>>> att[i] = attObj[i]; > >>>> } > >>>> } > >>>> att.data = swfUrlStr; > >>>> att.width = widthStr; > >>>> att.height = heightStr; > >>>> var par = {}; > >>>> if (parObj && typeof parObj === OBJECT) { > >>>> for (var j in parObj) { // copy object to avoid the use of references, > >>>> because web authors often reuse parObj for multiple SWFs > >>>> par[j] = parObj[j]; > >>>> } > >>>> } > >>>> if (flashvarsObj && typeof flashvarsObj === OBJECT) { > >>>> for (var k in flashvarsObj) { // copy object to avoid the use of > >>>> references, because web authors often reuse flashvarsObj for multiple > SWFs > >>>> if (typeof par.flashvars != UNDEF) { > >>>> par.flashvars += "&" + k + "=" + flashvarsObj[k]; > >>>> } > >>>> else { > >>>> par.flashvars = k + "=" + flashvarsObj[k]; > >>>> } > >>>> } > >>>> } > >>>> if (hasPlayerVersion(swfVersionStr)) { // create SWF > >>>> var obj = createSWF(att, par, replaceElemIdStr); > >>>> if (att.id == replaceElemIdStr) { > >>>> setVisibility(replaceElemIdStr, true); > >>>> } > >>>> callbackObj.success = true; > >>>> callbackObj.ref = obj; > >>>> } > >>>> else if (xiSwfUrlStr && canExpressInstall()) { // show Adobe Express > >>>> Install > >>>> att.data = xiSwfUrlStr; > >>>> showExpressInstall(att, par, replaceElemIdStr, callbackFn); > >>>> return; > >>>> } > >>>> else { // show alternative content > >>>> setVisibility(replaceElemIdStr, true); > >>>> } > >>>> if (callbackFn) { callbackFn(callbackObj); } > >>>> }); > >>>> } > >>>> else if (callbackFn) { callbackFn(callbackObj); } > >>>> }, > >>>> > >>>> switchOffAutoHideShow: function() { > >>>> autoHideShow = false; > >>>> }, > >>>> > >>>> ua: ua, > >>>> > >>>> getFlashPlayerVersion: function() { > >>>> return { major:ua.pv[0], minor:ua.pv[1], release:ua.pv[2] }; > >>>> }, > >>>> > >>>> hasFlashPlayerVersion: hasPlayerVersion, > >>>> > >>>> createSWF: function(attObj, parObj, replaceElemIdStr) { > >>>> if (ua.w3) { > >>>> return createSWF(attObj, parObj, replaceElemIdStr); > >>>> } > >>>> else { > >>>> return undefined; > >>>> } > >>>> }, > >>>> > >>>> showExpressInstall: function(att, par, replaceElemIdStr, callbackFn) { > >>>> if (ua.w3 && canExpressInstall()) { > >>>> showExpressInstall(att, par, replaceElemIdStr, callbackFn); > >>>> } > >>>> }, > >>>> > >>>> removeSWF: function(objElemIdStr) { > >>>> if (ua.w3) { > >>>> removeSWF(objElemIdStr); > >>>> } > >>>> }, > >>>> > >>>> createCSS: function(selStr, declStr, mediaStr, newStyleBoolean) { > >>>> if (ua.w3) { > >>>> createCSS(selStr, declStr, mediaStr, newStyleBoolean); > >>>> } > >>>> }, > >>>> > >>>> addDomLoadEvent: addDomLoadEvent, > >>>> > >>>> addLoadEvent: addLoadEvent, > >>>> > >>>> getQueryParamValue: function(param) { > >>>> var q = doc.location.search || doc.location.hash; > >>>> if (q) { > >>>> if (/\?/.test(q)) { q = q.split("?")[1]; } // strip question mark > >>>> if (param == null) { > >>>> return urlEncodeIfNecessary(q); > >>>> } > >>>> var pairs = q.split("&"); > >>>> for (var i = 0; i < pairs.length; i++) { > >>>> if (pairs[i].substring(0, pairs[i].indexOf("=")) == param) { > >>>> return urlEncodeIfNecessary(pairs[i].substring((pairs[i].indexOf("=") > + > >>>> 1))); > >>>> } > >>>> } > >>>> } > >>>> return ""; > >>>> }, > >>>> > >>>> // For internal usage only > >>>> expressInstallCallback: function() { > >>>> if (isExpressInstallActive) { > >>>> var obj = getElementById(EXPRESS_INSTALL_ID); > >>>> if (obj && storedAltContent) { > >>>> obj.parentNode.replaceChild(storedAltContent, obj); > >>>> if (storedAltContentId) { > >>>> setVisibility(storedAltContentId, true); > >>>> if (ua.ie && ua.win) { storedAltContent.style.display = "block"; } > >>>> } > >>>> if (storedCallbackFn) { storedCallbackFn(storedCallbackObj); } > >>>> } > >>>> isExpressInstallActive = false; > >>>> } > >>>> } > >>>> }; > >>>> }(); > >>> > >>> > >>> > >>> *Code of guacamoleaudio.js is as follows which loads SWF :-* > >>> > >>> > >>> > >>>> function GuacamoleFlashAudio(args) { > >>>> if (typeof this.init === "function") { > >>>> this.init.apply(this, (args && args.callee) ? args : > >>>> arguments); > >>>> } > >>>> } > >>>> GuacamoleFlashAudio.nextId = 1; > >>>> GuacamoleFlashAudio.prototype = { > >>>> nextId: null, > >>>> swf: 'dynamicaudio.swf', > >>>> > >>>> audioContext: null, > >>>> flashWrapper: null, > >>>> flashElement: null, > >>>> init: function(opts) { > >>>> var self = this; > >>>> self.id = GuacamoleFlashAudio.nextId++; > >>>> > >>>> if (opts && typeof opts['swf'] !== 'undefined') { > >>>> self.swf = opts['swf']; > >>>> } > >>>> self.flashWrapper = document.createElement('div'); > >>>> self.flashWrapper.id = 'guacamole-audio-flashwrapper-'+ > >>>> self.id; > >>>> var s = self.flashWrapper.style; > >>>> s['position'] = 'fixed'; > >>>> s['width'] = s['height'] = '8px'; > >>>> s['bottom'] = s['left'] = '0px'; > >>>> s['overflow'] = 'hidden'; > >>>> self.flashElement = document.createElement('div'); > >>>> self.flashElement.id = 'guacamole-audio-flashelement-'+ > >>>> self.id; > >>>> self.flashWrapper.appendChild(self.flashElement); > >>>> document.body.appendChild(self.flashWrapper); > >>>> swfobject.embedSWF( > >>>> self.swf, > >>>> self.flashElement.id, > >>>> "8", > >>>> "8", > >>>> "9.0.0", > >>>> null, > >>>> null, > >>>> {'allowScriptAccess': 'always'}, > >>>> null, > >>>> function(e) { > >>>> self.flashElement = e.ref; > >>>> } > >>>> ); > >>>> > >>>> }, > >>>> write: function(samples) { > >>>> if (this.flashElement !== null) { > >>>> var out = new Array(samples.length); > >>>> for (var i = samples.length-1; i !== 0; i--) { > >>>> out[i] = this.floatToIntSample(samples[i]); > >>>> } > >>>> * this.flashElement.write(out.jo <http://out.jo>in(' ')); > >>>> // This method calls flash ( action script method of write )* > >>>> } > >>>> }, > >>>> writeInt: function(samples) { > >>>> if (this.flashElement !== null) { > >>>> this.flashElement.write(samples.join(' ')); > >>>> } > >>>> }, > >>>> intToFloatSample: function(value) { > >>>> return value / 32768; // from -32767..32768 to -1..1 range > >>>> }, > >>>> floatToIntSample: function(value) { > >>>> return Math.floor(value * 32768); // from -1..1 to > >>>> -32767..32768 range > >>>> } > >>>> }; > >>> > >>> > >>> *Code of demo.html is as follows : - * > >>> > >>> <!DOCTYPE html> > >>>> <html> > >>>> <head> > >>>> <title>Gucamole Demo of Audio with flash</title> > >>>> </head> > >>>> <body> > >>>> > >>>> <script type="text/javascript" src="swfobject.js"></script> > >>>> <script type="text/javascript" src="guacamoleaudio.js"></script> > >>>> <script type="text/javascript" charset="utf-8"> > >>>> > >>>> var audioData = []; > >>>> var frequency = 440; > >>>> var interval = null; > >>>> var gucamoleAudio = new GuacamoleFlashAudio({'swf': > >>>> 'dynamicaudio.swf'}); > >>>> > >>>> function start() { > >>>> interval = setInterval(function() { > >>>> var n = Math.ceil(frequency / 100) * 2; > >>>> for (var i=0; i < n; i++) { > >>>> * gucamoleAudio.write(audioData); * > >>>> } > >>>> }, 10); > >>>> } > >>>> function playSound() { > >>>> var samples = 44100 / frequency; > >>>> audioData = Array(Math.round(samples)); > >>>> for (var i=0; i < audioData.length; i++) { > >>>> audioData[i] = Math.sin(2*Math.PI * (i / > >>>> audioData.length)); > >>>> } > >>>> } > >>>> playSound(); > >>>> start(); > >>>> </script> > >>>> </body> > >>> > >>> > >>> > >>> That is how I am configuring from this demo to integrate into Gucamole. > >>> > >>> > >>> > >>> > >>> > >>> On Tue, Nov 14, 2017 at 12:01 AM, Frode Langelo <[email protected]> > wrote: > >>> > >>>> Hi Amarjeet, > >>>> > >>>> Your attachment was stripped so I do not see what your added log > >>>> statement reads. > >>>> > >>>> At this point your main problem is still getting JavaScript to > >>>> communicate with your Flash object. > >>>> > >>>> I would look at this answer and add similar code and logging to ensure > >>>> your Flash code is working correctly: > >>>> https://stackoverflow.com/questions/10050562/calling-actions > >>>> cript-function-from-js?answertab=active#tab-top > >>>> > >>>> How you are getting the handle to the Flash object. I assume something > >>>> like document.getElementById('mySWF')? > >>>> > >>>> I would create a simple test HTML page to exercise only loading your > >>>> SWF and test JavaScript to Flash communication to make sure that part > >>>> works fine before integrating this into Guacamole. > >>>> > >>>> Frode > >>>> > >>>> On Mon, Nov 13, 2017 at 10:06 AM, Amarjeet Singh < > [email protected]> > >>>> wrote: > >>>> > I diged into it but nothing came out so far. > >>>> > I tried online forums as well but they used almost same method but > >>>> with mp3 > >>>> > files.. I looked into sound Manager 2 and many other fallback API's > but > >>>> > they play sound with mp3 files. Use of IE is huge and people haven't > >>>> > upgraded to Windows 10. Sound is very important. > >>>> > If anyone have any ideas please share. > >>>> > > >>>> > Thanks and Regards, > >>>> > Amarjeet Singh > >>>> > > >>>> > On Nov 11, 2017 12:57, "Amarjeet Singh" <[email protected]> > wrote: > >>>> > > >>>> > Hi Frode, > >>>> > > >>>> > I tried what you said in the above mail thread. > >>>> > > >>>> > > >>>> > console.log(this.flashElement); > >>>> > > >>>> > > >>>> > *T**he response I get in the console ( Please refer the attachment > >>>> ):-* > >>>> > > >>>> > Couldn't create AudioContext:ReferenceError: 'AudioContext' is > >>>> undefined, > >>>> >> falling back to flash player > >>>> > > >>>> > > >>>> > <object width="8" height="8" id="guacamole-flashelement-1" > >>>> >> data="guacamole.swf" type="application/x-shockwave-flash" > >>>> >> style="visibility: visible;"><param name="allowScriptAccess" > >>>> >> value="always"></object> > >>>> > > >>>> > > >>>> > Error : *SCRIPT438: Object doesn't support property or method > 'write'* > >>>> > > >>>> > > >>>> > > >>>> > Regards, > >>>> > Amarjeet > >>>> > > >>>> > > >>>> > On Sat, Nov 11, 2017 at 4:30 AM, Frode Langelo <[email protected]> > >>>> wrote: > >>>> > > >>>> >> Hi Amarjeet, > >>>> >> > >>>> >> I am assuming the line this.flashElement.write(...) causes this: > >>>> >> Error : *SCRIPT438: Object doesn't support property or method > 'write'* > >>>> >> > >>>> >> Unfortunately I am not a Flash expert.. I'd check some of the Flash > >>>> >> related forums for JavaScript/Flash integration. > >>>> >> How are you loading your Flash element? I would start looking > there.. > >>>> >> the culprit appears to be JavaScript not able to access the 'write' > >>>> >> method exposed via ExternalInterface.addCallback in the > ActionScript. > >>>> >> Perhaps Flash was not yet ready when you call the write method? > What > >>>> >> does console.log(this.flashElement); say, just before calling > >>>> >> this.flashElement.write(...) ? > >>>> >> > >>>> >> Kind regards. > >>>> >> Frode > >>>> >> > >>>> >> On Fri, Nov 10, 2017 at 12:03 PM, Amarjeet Singh < > >>>> [email protected]> > >>>> >> wrote: > >>>> >> >> > >>>> >> >> varfloatBuffer = toAudioBuffer(new SampleArray(arrayBuffer)); > >>>> >> >> sendToFlash(floatBuffer.buffer); > >>>> >> > > >>>> >> > > >>>> >> > It doesn't worked. I am getting the error in the console log > while > >>>> >> calling > >>>> >> > flash.write method > >>>> >> > > >>>> >> > Error : *SCRIPT438: Object doesn't support property or method > >>>> 'write'* > >>>> >> > > >>>> >> > While I am trying the below code it is playing the sound with no > >>>> errors:- > >>>> >> > > >>>> >> > var sampledata = []; > >>>> >> >> var freq = 440; > >>>> >> >> var interval = null; > >>>> >> >> var guacamole= new Guacamole({'swf': 'guacamole.swf'}); > >>>> >> >> > >>>> >> >> function start() { > >>>> >> >> interval = setInterval(function() { > >>>> >> >> var n = Math.ceil(freq / 100) * 2; > >>>> >> >> for (var i=0; i < n; i++) { > >>>> >> >> guacamole.write(sampledata); // calls > >>>> >> Guacamole.write > >>>> >> >> } > >>>> >> >> }, 10); > >>>> >> >> } > >>>> >> > > >>>> >> > function createSound() { > >>>> >> >> var samples = 44100 / freq; > >>>> >> >> sampledata = Array(Math.round(samples)); > >>>> >> >> for (var i=0; i < sampledata.length; i++) { > >>>> >> >> sampledata[i] = Math.sin(2*Math.PI * (i / > >>>> >> >> sampledata.length)); > >>>> >> >> } > >>>> >> >> } > >>>> >> > > >>>> >> > createSound();start(); > >>>> >> > > >>>> >> > > >>>> >> > > >>>> >> > > >>>> >> >> Guacamole.write: function(samples) { > >>>> >> >> var out = new Array(samples.length); > >>>> >> >> for (var i = 0;i < samples.length; i++) { > >>>> >> >> out[i] = this.floatToIntSample(samples[i]); > >>>> >> >> } > >>>> >> >> as = out.join(' '); > >>>> >> >> this.flashElement.write(as); // this write calls the > >>>> >> >> flash.write > >>>> >> >> }, > >>>> >> > > >>>> >> > floatToIntSample: function(value) { > >>>> >> >> return Math.floor(value * 32768); // from -1..1 to > >>>> -32767..32768 > >>>> >> >> range > >>>> >> >> } > >>>> >> > > >>>> >> > > >>>> >> > swf is embedded in HTML document .. > >>>> >> > > >>>> >> > > >>>> >> > > >>>> >> > Please give any suggestions ... What I am missing here ? > >>>> >> > I have data coming in audio stream and I have swf to play the > >>>> sound but > >>>> >> > something with the flow of PCM data to swf is missing. > >>>> >> > > >>>> >> > > >>>> >> > On Fri, Nov 10, 2017 at 10:50 PM, Frode Langelo < > [email protected]> > >>>> >> wrote: > >>>> >> > > >>>> >> >> On Fri, Nov 10, 2017 at 3:12 AM, Amarjeet Singh < > >>>> [email protected]> > >>>> >> >> wrote: > >>>> >> >> > Hi Frode, > >>>> >> >> > > >>>> >> >> > I really appreciate the response and guidance you provided. It > >>>> helped > >>>> >> me > >>>> >> >> to > >>>> >> >> > look for more options and created lot of questions in my mind > as > >>>> well. > >>>> >> >> > > >>>> >> >> > *1. How can I skip these lines in toAudioBuffer ?* > >>>> >> >> > > >>>> >> >> > var packetTime = context.currentTime; > >>>> >> >> > if (nextPacketTime < packetTime) > >>>> >> >> > nextPacketTime = packetTime; > >>>> >> >> > var audioBuffer = context.createBuffer(format.channels, > >>>> samples, > >>>> >> >> > format.rate); > >>>> >> >> > > >>>> >> >> > It requires *context.currentTime* but in case of IE context is > >>>> NULL > >>>> >> and > >>>> >> >> > nothing will be returned in *packetTime*. > >>>> >> >> > >>>> >> >> For the purpose of only converting to a float array, you could > try > >>>> >> >> something like: > >>>> >> >> > >>>> >> >> var toAudioBuffer = function toAudioBuffer(data) { > >>>> >> >> > >>>> >> >> // Calculate total number of samples > >>>> >> >> var samples = data.length / format.channels; > >>>> >> >> > >>>> >> >> // Create the Float output audio buffer > >>>> >> >> var audioBuffer = new window.Float32Array(data.length); > >>>> >> >> > >>>> >> >> // Convert each channel > >>>> >> >> for (var channel = 0; channel < format.channels; channel++) > { > >>>> >> >> > >>>> >> >> // Fill audio buffer with data for channel > >>>> >> >> var offset = channel; > >>>> >> >> for (var i = 0; i < samples; i++) { > >>>> >> >> audioData[offset] = data[offset] / maxSampleValue; > >>>> >> >> offset += format.channels; > >>>> >> >> } > >>>> >> >> > >>>> >> >> } > >>>> >> >> > >>>> >> >> return audioBuffer; > >>>> >> >> > >>>> >> >> }; > >>>> >> >> > >>>> >> >> > >>>> >> >> > *2. Can I skip pushAudioPacket () and shiftAudioPacket() > methods > >>>> as > >>>> >> well > >>>> >> >> ? > >>>> >> >> > ( I don't know what these methods are trying to do.. )* > >>>> >> >> > >>>> >> >> These methods are used to buffer, synchronize audio packet > >>>> playback, > >>>> >> >> and rearrange (and split) the packets so that the packets are > cut > >>>> >> >> where the audio volume is at a low point to reduce the amount of > >>>> >> >> audible clipping between packets played back. Fot the purpose of > >>>> >> >> getting your prototype working I wouldn't worry about this for > now; > >>>> >> >> but when you are going for a complete implementation you should > >>>> look > >>>> >> >> at creating a new AudioPlayer implementation for your Flash > audio > >>>> >> >> player. > >>>> >> >> > >>>> >> >> > *3. Do I need nextPacketTime as well ? * > >>>> >> >> > > >>>> >> >> > ( source.start(nextPacketTime); ) > >>>> >> >> > >>>> >> >> Not yet (see above comment) > >>>> >> >> > >>>> >> >> > *4. Can I directly call toAudioBuffer function passing > >>>> ArrayBuffer of > >>>> >> >> 6048 > >>>> >> >> > byte and skip the packetTime and context.createBuffer ?* > >>>> >> >> > >>>> >> >> The toAudioBuffer function expects a SampleArray which in this > >>>> case is > >>>> >> >> an Int16Array. You could do toAudioBuffer(new > >>>> >> >> SampleArray(arrayBuffer)); > >>>> >> >> If you look at the implementation of RawAudioPlayer, it receives > >>>> the > >>>> >> >> raw audio data in playReceivedAudio from > ArrayBufferReader.ondata. > >>>> >> >> > >>>> >> >> > *5. If I use Int16Array over ArrayBuffer It view the data in > >>>> integers > >>>> >> of > >>>> >> >> 16 > >>>> >> >> > byte and if use the following for loop: > >>>> >> >> > [snip] > >>>> >> >> > It will push the data for left channel together and right > channel > >>>> >> >> together > >>>> >> >> > into an array. > >>>> >> >> > Now, Can I pass this data to my Flash Action Script in a > string > >>>> to > >>>> >> play > >>>> >> >> at > >>>> >> >> > 44.1Khz with 2 channels ? > >>>> >> >> > >>>> >> >> You would need to pass the underlying ArrayBuffer to your Flash > >>>> >> >> script. I am not sure if it can consume it directly though. > >>>> >> >> > >>>> >> >> var floatBuffer = toAudioBuffer(new SampleArray(arrayBuffer)); > >>>> >> >> sendToFlash(floatBuffer.buffer); > >>>> >> >> > >>>> >> >> > >>>> >> >> > I would be very grateful if you look into the above queries > and > >>>> give > >>>> >> some > >>>> >> >> > guidance so that I can move forward. > >>>> >> >> > > >>>> >> >> > Thanks and Regards, > >>>> >> >> > Amarjeet Singh > >>>> >> >> > > >>>> >> >> > >>>> >> > >>>> > >>> > >>> > >> > >
