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 >>> >> >> > >>> >> >> >>> >> >>> >> >> >
