0

Flex で 5 バンド イコライザーをテストするための小さなアプリケーションを開発しました。このリンクでコードを見つけましたFlex Equalizer イコライザー は正常に動作しますが、mp3 ファイルの再生中に目的の位置を探すことができません。以下は私のコードです....この問題を解決するには?

        import __AS3__.vec.Vector;

        import mx.events.FlexEvent;


        import spark.components.VSlider;
        public static const BUFFER_SIZE:int = 8192;
        public static const SAMPLE_RATE:int = 44100;
        private var _Position:Number=0;
        private var timer:Timer = new Timer(1000);

        private const _soundURI:String = "testfile.mp3";

        private var _out_snd:Sound = new Sound();
        private const _eqL:EQ = new EQ();
        private const _eqR:EQ = new EQ();
        private var _loop_snd:Sound = new Sound();
        // For storing dynamically created VSliders
        private const _sliders_vect:Vector.<VSlider> = new Vector.<VSlider>();
        private var _channel:SoundChannel = new SoundChannel();
        private var _samples:ByteArray;
        protected function view1_initializeHandler(event:FlexEvent):void
        {
            // TODO Auto-generated method stub
            timer.addEventListener(TimerEvent.TIMER,timerFunction);

            pgHolder.addEventListener(MouseEvent.CLICK,seekf);
            setupEQ();
            loadSound();
        }
        private function timerFunction(event:TimerEvent):void
        {       
            _Position = _channel.position;      
            pgHolder.value=_Position;
        }

        private function seekf(event:MouseEvent):void
        {

            _channel.stop();                
            _Position = (pgHolder.contentMouseX/pgHolder.width)*_loop_snd.length;   
            startPlay();
        }
        private function loadSound():void 
        {
            _Position=0;                
            _loop_snd.addEventListener(Event.COMPLETE, loadSoundComplete);
            _loop_snd.addEventListener(IOErrorEvent.IO_ERROR, loadSoundError);  
            _out_snd.addEventListener(SampleDataEvent.SAMPLE_DATA, processSound);
            _loop_snd.load(new URLRequest(_soundURI));
        }

        private function loadSoundComplete(event:Event):void 
        {
            pgHolder.minimum=0;
            pgHolder.maximum=_loop_snd.length;
            timer.start();                              
            startPlay();                
        }           

        private function startPlay():void 
        {
            _channel=_out_snd.play(_Position);  
        }

        private function loadSoundError(event:Event):void 
        {
            trace("loadError");
        }

        // Create Sliders for changing EQ gain
        private function setupEQ():void 
        {                
            var slider:VSlider;
            for (var i:int = 0; i < _eqL.gains.length; i++) {
                slider = new VSlider();
                slider.x = (i * 35);
                slider.y = 20;
                slider.value = .9;
                slider.maximum = 1;
                slider.snapInterval=0.1;
                slider.minimum = 0;
                slider.addEventListener("change", changeEQHandler);
                addElement(slider);
                _sliders_vect[i] = slider;
            }

            var event:Event = new Event("change");
            changeEQHandler(event);
        }    

        private function processSound(event:SampleDataEvent):void 
        {
            //trace("loading");
            if(_Position>=_loop_snd.length)
            {
                _channel.stop();
            }
            _samples = new ByteArray();             
            var len:Number = _loop_snd.extract(_samples,BUFFER_SIZE);
            var i:int=0;
            var l:Number;
            var r:Number;

            if ( len < BUFFER_SIZE ) { // If end of MP3, start over
                len += _loop_snd.extract(_samples,BUFFER_SIZE-len,0);
            }
            _samples.position = 0;
            trace("len" + len + "//" + _channel.position + "//" +_samples.length); 
            while (i < BUFFER_SIZE) {
                event.data.writeFloat(_eqL.compute(_samples.readFloat()));
                event.data.writeFloat(_eqR.compute(_samples.readFloat()));                  
                i++;
            }                   
        }           

        // Update EQ gains when sliders are changed
        private function changeEQHandler(event:Event):void 
        {    
            var i:int = 0;
            for(i = 0; i < _eqL.gains.length; i++){
                _eqL.gains[i] = _sliders_vect[i].value * 2;
            }

            for(i = 0; i < _eqR.gains.length; i++){
                _eqR.gains[i] = _sliders_vect[i].value * 2;
            }
        }



    ]]>
</fx:Script>
<fx:Declarations>
    <!-- Place non-visual elements (e.g., services, value objects) here -->
</fx:Declarations>
<s:HSlider width="100%" height="100%" id="pgHolder">

</s:HSlider>

4

1 に答える 1

0

スライダーの変更を処理すると、新しい _Position が計算されますが、_Position はバインド可能ではなく、決して使用されないセットがプレーヤーの位置を設定します。

これは単なる疑似コードですが、次のようなことをすべきではありません。

private function seekf(event:MouseEvent):void
{
    _channel.stop();                
    _channel.position = (pgHolder.contentMouseX/pgHolder.width)*_loop_snd.length;   
    _channel.start();
 }

コードを見るだけで、_Position = _channel.position を設定すると、参照ではなく値を取得するだけです。私の推測では、 _channel.position を設定する必要があります

于 2013-10-21T21:58:48.600 に答える