Sound and Garbage Collection

I’ve run into lots of garbage collection issues with an interface that loads external movies. One of the problem spots is with audio. Many of the external movies contain audio in their Library and each of those sound files is given a class of “Audio_1”. There’s an external class for Audio_1 that is basically blank, but it is needed to define the class to other external classes. The issue is, after loading a new movie, the interface often continues to play the “old” audio track rather than the audio embedded in the new file. The Garbage Collector isn’t removing the old class instance. If the interface loads a movie without audio in between two that do, that often allows time for the old audio to be garbage collected. But it’s not a guarantee.

The audio code I’m using looks like this (note that there may be some code left out for clarity:


        public function showAudioControls():void {
            
            audioControls.x = 710;
            audioControls.y = 583;

            playPause_btn.gotoAndStop("pause");
            //
            rewindBtnPulse.gotoAndStop(1);
            playBtnPulse.gotoAndStop(1);
            //
            rewind_btn.buttonMode = true;
            rewind_btn.useHandCursor = true;
            rewind_btn.mouseChildren = false;
            //
            playPause_btn.buttonMode = true;
            playPause_btn.useHandCursor = true;
            playPause_btn.mouseChildren = false;
            //
            rewind_btn.addEventListener(MouseEvent.CLICK, replayCurrentAudio, false, 0, true);
            rewind_btn.addEventListener(MouseEvent.MOUSE_OVER, rewindRollOver, false, 0, true);
            rewind_btn.addEventListener(MouseEvent.MOUSE_OUT, rewindRollOut, false, 0, true);
            playPause_btn.addEventListener(MouseEvent.CLICK, pauseCurrentAudio, false, 0, true);
            playPause_btn.addEventListener(MouseEvent.MOUSE_OVER, playPauseRollOver, false, 0, true);
            playPause_btn.addEventListener(MouseEvent.MOUSE_OUT, playPauseRollOut, false, 0, true);

        }
        public function hideAudioControls():void {
            // CALLED WHEN NEW PAGE IS LOADED
            soundControl.stop();
            //trace("Controls have been hidden and audio stopped");
            soundControl.removeEventListener(Event.SOUND_COMPLETE, audioComplete);
            playPause_btn.removeEventListener(MouseEvent.CLICK, pauseCurrentAudio);
            playPause_btn.removeEventListener(MouseEvent.CLICK, resumeCurrentAudio);
            // SET VARS TO NULL FOR GARBAGE COLLECTION AFTER LISTENER IS REMOVED
            soundControl = null;
            voiceOver = null;
            resumeTime = 0;
            playPause_btn.gotoAndStop("play");
            if (audioControls.y == 532) {
                yPosTween = new Tween(audioControls, "y", Strong.easeOut, 532, 583, 0.40, true);
            }
        }
        //*************INDIVIDUAL PAGES WITH AUDIO CALL THIS FUNCTION***********//
        public function playCurrentAudio():void {
            showAudioControls();
            voiceOver = new Audio_1();
            soundControl = voiceOver.play(0,1);
            soundControl.addEventListener(Event.SOUND_COMPLETE, audioComplete, false, 0, true);
        }
        public function stopCurrentAudio(event:MouseEvent):void {
            soundControl.stop();
            soundControl = null;
            voiceOver = null;
            resumeTime = 0;
            playPause_btn.gotoAndStop("play");
            audioControls.y = 583;
        }
        public function replayCurrentAudio(event:MouseEvent):void {
            soundControl.stop();
            resumeTime = 0;
            soundControl = voiceOver.play(resumeTime,1);
            soundControl.addEventListener(Event.SOUND_COMPLETE, audioComplete);
            playPause_btn.gotoAndStop("pause");
        }
        public function pauseCurrentAudio(event:MouseEvent):void {
            resumeTime = soundControl.position;
            soundControl.stop();
            playPause_btn.gotoAndStop("play");
            playPause_btn.removeEventListener(MouseEvent.CLICK, pauseCurrentAudio);
            playPause_btn.addEventListener(MouseEvent.CLICK, resumeCurrentAudio, false, 0, true);
        }
        public function resumeCurrentAudio(event:MouseEvent):void {
            soundControl = voiceOver.play(resumeTime);
            soundControl.addEventListener(Event.SOUND_COMPLETE, audioComplete);
            playPause_btn.gotoAndStop("pause");
            playPause_btn.removeEventListener(MouseEvent.CLICK, resumeCurrentAudio);
            playPause_btn.addEventListener(MouseEvent.CLICK, pauseCurrentAudio, false, 0, true);
        }
        public function audioComplete(event:Event):void {
            soundControl.stop();
            soundControl.removeEventListener(Event.SOUND_COMPLETE, audioComplete);
            playPause_btn.removeEventListener(MouseEvent.CLICK, pauseCurrentAudio);
            playPause_btn.addEventListener(MouseEvent.CLICK, resumeCurrentAudio, false, 0, true);
            // DO NOT SET SOUND VARS TO NULL IN THIS FUNCTION OR resumeCurrentAudio() WILL NOT WORK 
            resumeTime = 0;
            playPause_btn.gotoAndStop("play");
        }
        private function playPauseRollOver(event:MouseEvent):void {
            playPause_btn.playBtnPulse.play();
        }
        private function playPauseRollOut(event:MouseEvent):void {
            playPause_btn.playBtnPulse.gotoAndStop(1);
        }
        private function rewindRollOver(event:MouseEvent):void {
            rewind_btn.rewindBtnPulse.play();
        }
        private function rewindRollOut(event:MouseEvent):void {
            rewind_btn.rewindBtnPulse.gotoAndStop(1);
        }

If anyone can improve upon the logic I would appreciate the help. One other thing: when an external movie with audio is loaded it calls playCurrentAudio() in the main interface.