2013-10-21 55 views
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> 

回答

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

+0

你的猜測是正確的......但_channel.position是隻讀屬性,我們不能爲它分配值...我認爲我們需要在processSound(event :SampleDataEvent)函數....如果我做了該函數的任何更改...它給我結尾的文件遇到異常..... – user711023