A couple of things which stand out:

1) I don't see anywhere in your pasted Flash code which deals with a Flash
var called "mp3", so I am unsure if there is more to the code or if the swf
is not designed to take the mp3 var initially...

2) As you have a proper ExternalInterface method which loads / kills
external sounds etc, you shouldn't ever need to destroy/recreate your swf
(unless you are using the same dom element to load other swfs/content.

3) I would listen for the "resetPlay" function call in your html/js code,
as this tells you when the swf is loaded/external interface is all set up
etc. You are then safe to call doPlay(), stopPlay() etc on your swf.

4) Have a look at the EI example o the test suite to see how the code
checks for the existence of functions / wires up the html buttons etc:

http://www.bobbyvandersluis.com/swfobject/testsuite_2_2/test_dynamic_com.html

with embed callback:
http://www.bobbyvandersluis.com/swfobject/testsuite_2_2/test_dynamic_com2.html


Cheers,
Aran



On Tue, Nov 29, 2011 at 2:59 PM, Arknath <[email protected]> wrote:

> Hi all,
>
> New to the group, so hi!
>
> Having an issue getting my JS to call ActionScript (AS) functions.
>
> Scenario:
>
> Have a page full of ringtones (15-25) and want to have the ability to
> play a preview before purchase.  Using a single file (ringtone.swf)
> that has ActionScript that looks like this (I did not write this AS):
>
> import flash.external.*;
>
> ExternalInterface.addCallback("stopPlay", this, stopPlay);
> ExternalInterface.addCallback("doPlay", this, doPlay);
>
> _global.mySong = null;
> _global.duration = null;
> _global.position = null;
> _global.playingID = null;
> _global.streamingID = null;
> _global.absoluteURL = "/url/where/ringtone/stored/ringtone.php?id=";
>
>
> function formatTime(millis) {
>        var mins = Math.floor(millis / 60000);
>        var remaining = millis - (mins * 60000);
>        var secs = Math.floor(remaining / 1000);
>        if(secs < 10){
>                secs = '0' + secs;
>        }
>        return mins + ':' + secs;
> }
>
> var tooLong = 0;
>
> function displayStreaming(mySound, where) {
>        if(tooLong++ > 3000) {
>            ExternalInterface.call('alert', "We're sorry, it appears that
> this ringtone isn't available for listening at this time.  Please try
> again later.");
>        clearInterval(streamingID);
>                stopPlay();
>        tooLong = 0;
>        } else if(mySound.duration > 0) {
>                if(mySound.getBytesLoaded() == mySound.getBytesTotal()) {
>                        clearInterval(streamingID);
>                        ExternalInterface.call(isLoaded);
>            tooLong = 0;
>                }
>                where.text = formatTime(mySound.duration);
>        }
> }
>
> function displayPosition(mySound, where) {
>    if(mySound.position > 0){
>        if(mySound.position == mySound.duration) {
>            clearInterval(playingID);
>        }
>        where.text = formatTime(mySound.position);
>    }
> }
>
> function doPlay(mp3){
>    theSong = loc + absoluteURL + mp3;
>
>    clearInterval(streamingID);
>    clearInterval(playingID);
>
>    if(typeof mySong == "object") {
>        mySong.stop();
>        delete mySong;
>    }
>
>    duration.text = '0:00';
>    position.text = '0:00';
>
>    mySong = new Sound();
>    mySong.loadSound(theSong, true);
>
>    streamingID = setInterval(displayStreaming, 1, mySong, duration);
>    playingID = setInterval(displayPosition, 1, mySong, position);
>
>    mySong.onSoundComplete = function(){ stopPlay(); }
> }
>
> function stopPlay() {
>    duration.text = "0:00";
>    position.text = "0:00";
>
>    mySong.stop();
>    delete mySong;
>
>    clearInterval(streamingID);
>    clearInterval(playingID);
>
>    ExternalInterface.call(resetPlay);
> }
>
> function initSound() {
>    duration = _root.total_txt;
>    position = _root.time_txt;
> }
>
> initSound();
>
> My JS looks like this:
>
> //Embeded <object> ID
> var embed_id = "ringtone";
>
> //Global SWFObject vars
> var player = "myContent";
> var audio_file = "/assets/swf/ringtone.swf";
> var player_width = '16';
> var player_height = '16';
> var flash_ver = "9.0.0";
> var express_install = false;
> var params = {allowScriptAccess: "always", swliveconnect: "true",
> wmode: "transparent"};
> var attributes = {id:embed_id,name:embed_id};
> var call_backs = function(){};
>
> //Gets current site URL
> var base_url = "http://"; + window.location.hostname + "/
> product/";
>
> function loadSWF(preview_id){
>
>    //SWFObject Vars
>    var flashvars = {loc: base_url};//, mp3: preview_id};
>    //var flashvars = {};
>
>        swfobject.embedSWF(audio_file, player, player_width, player_height,
> flash_ver, express_install, flashvars, params, attributes,
> call_backs);
> }
>
> //Determines the existence or absence of a previously embedded swf
> file
> function swfExists(obj_id){
>    var exists = false;
>    var object_tag = $("#"+obj_id);
>
>    if(object_tag && (object_tag.is("object") ||
> object_tag.is("embed"))){
>        exists = true;
>    }
> console.log("Exists: " +exists);
>    return exists;
> }
>
> $(document).ready(function(){
>
>   $(".ringtone-preview").on("click",function(e){
>        e.preventDefault();
>        var preview_id = $(this).attr('id');
> console.log("Preview ID:" + preview_id);
>        //check to see if object exists
>        if(swfExists(embed_id)){
> console.log("Secondary click");
>            swfobject.removeSWF(embed_id);
>            $("body").append("<div id='"+player+"'></div>");
>            loadSWF(preview_id);
>        }else{
> console.log("Primary click");
>            loadSWF(preview_id);
>        }
>
>        var obj = document.getElementById(embed_id);
> console.log(obj);
>        if (obj){
>            obj.doPlay(preview_id);
> console.log("Playing");
>        }
>    });
> });
>
> I get an error when it gets to the "obj.doPlay(preview_id)" line that
> reads:
>
> obj.doPlay is not a function
>
> If run loadSWF without the "mp3 : preview_id" piece commented out,
> then it plays the ringtone.  However, I want to be able to access the
> stopPlay() function if the user fires the .ringtone-preview event
> again.
>
> I feel i'm almost there...just need access to the flash script.
>
> Any help is appreciated.
>
> --
> You received this message because you are subscribed to the Google Groups
> "SWFObject" group.
> To post to this group, send email to [email protected].
> To unsubscribe from this group, send email to
> [email protected].
> For more options, visit this group at
> http://groups.google.com/group/swfobject?hl=en.
>
>

-- 
You received this message because you are subscribed to the Google Groups 
"SWFObject" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/swfobject?hl=en.

Reply via email to