Question

public var swfLoader:SWFLoader = new SWFLoader();

[Embed(source="/some/file1.swf")]
public var file1:Class;

[Embed(source="/some/file2.swf")]
public var file2:Class;

then I do:

swfLoader.load(file1);

Later on:

swfLoader.unloadAndStop(true);

which unloads the video, but not the sound! So I add in

SoundMixer.stopAll();

Which is ok, for a while. Later on, I do:

swfLoader.load(file2);

And eventually, while watching file2, file1's audio will start playing in the background over file2's audio, with no way to stop it! What is the proper way to stop the audio of file1? The way I keep seeing is use unloadAndStop() which I am using. Unless I have to create a new swfLoader object each time?

As per Konrad's answer below, I should stop playing the sound in cleanup events, such as REMOVED_FROM_STAGE, however, how can I stop playing the sound on a swf file that is loaded with a SWFLoader? I don't see an obvious way to do that.

Was it helpful?

Solution

Solutions is bit tricky, because problem is with loaded content.

Garbage collector won't remove sound because it is still playing (so its referenced by Flash Player) but you don't have access to its sound channel (because its hidden similar to private variables in classes). That behavior is totally correct.

Solution: In loaded swf code you should stop playing that sound (in REMOVED_FROM_STAGE or other 'cleanup' event handler). Other solutions (like SoundMixer.stopAll) will work in some cases but not in all.

We often forget to clean after ours applications. Its not problem if they exist same as instance of Flash Player (removing it will clean all memory used by our swf). Problems begins when we load and unload swfs. Ignoring cleanups is fast way to memory leaks.

OTHER TIPS

swfLoader.unloadAndStop(true);

Does remove the swf and the sound as well . Works fine for me . Even the documentation says : Unloads an image or SWF file. After this method returns the source property will be null. This is only supported if the host Flash Player is version 10 or greater. If the host Flash Player is less than version 10, then this method will unload the content the same way as if source was set to null. This method attempts to unload SWF files by removing references to EventDispatcher, NetConnection, Timer, Sound, or Video objects of the child SWF file. As a result, the following occurs for the child SWF file and the child SWF file's display list: Sounds are stopped. Stage event listeners are removed. Event listeners for enterFrame, frameConstructed, exitFrame, activate and deactivate are removed. Timers are stopped. Camera and Microphone instances are detached Movie clips are stopped.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top