2016-03-24 54 views
0

我使用的是tarsos DSP java API。有人可以告訴我爲什麼float pitch不會在下面的代碼中被freq()方法更新嗎?誰能告訴我什麼改變,以得到它的工作,因爲我看不出爲什麼它not.Thanks爲什麼方法不更新變量值?

public class trial extends JFrame{ 
File f = new File("RecordAudio.wav"); 
static JLabel lblNewLabel = new JLabel("New label"); 
float pitchInHz; 
public trial(){ 
    getContentPane().setLayout(new GridLayout(1, 0, 0, 0)); 
    getContentPane().add(lblNewLabel); 
    run(); 
    freq(); 
    float values = freq(); 
    System.out.print(values); 

} 
public void run(){ 
    AudioDispatcher dispatcher = null; 
    try { 
     dispatcher = AudioDispatcherFactory.fromFile(f, 1024, 0); 
    } catch (UnsupportedAudioFileException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    AudioProcessor p = new PitchProcessor(PitchEstimationAlgorithm.FFT_YIN, 48000, 1024, pdh); 
    dispatcher.addAudioProcessor(p); 
    new Thread(dispatcher,"Audio Dispatcher").start(); 


} 
public float freq(){ 
    return pitchInHz; 
} 

PitchDetectionHandler pdh = new PitchDetectionHandler() { 

    public void handlePitch(PitchDetectionResult result,AudioEvent e) { 

       float pitchInHz = result.getPitch(); 
       lblNewLabel.setText("" + pitchInHz); 
       //System.out.print(pitchInHz); 
    } 

}; 


public static void main(String[] args) { 
    EventQueue.invokeLater(new Runnable() { 
     public void run() { 
      try { 
       trial frame = new trial(); 
       frame.setVisible(true); 
       frame.setSize(500, 500); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    }); 
} 

}

+0

簡短的回答是,'handlePitch'不會被調用,或者是,結果居然是0 –

回答

0

大概是因爲pitchInHz = result.getPitch();還沒有被執行的時候你執行pitch.getPitch()。這是完全可能的,因爲這段代碼是在一個新線程中同時執行的,並且在該線程啓動後立即調用該代碼段,而不是讓庫有任何時間執行回調。

該方法返回0,因爲float pitchInHz;相同float pitchInHz = 0.0f;

+0

我怎麼會改變調用方法確保pitchInHz在打印之前確實發生了變化? –

+0

@ G.Mcc不是創建一個線程('new Thread(dispatcher,...).start()')直接調用調度器'dispatcher.run()'。雖然我不知道這是否會回來,因爲我不知道圖書館。或者在回調中做任何你想做的事情,而不是通過一個變量傳遞它。 – Kiskae

+0

我以前試過,它只是將值設置爲-1,如果沒有檢測到音高,則它是默認值,因此它永遠不會運行。我希望能解決它。謝謝你的幫助 –