为什么方法不更新变量值?

时间:2016-03-24 00:09:08

标签: java tarsosdsp

我正在使用tarsos DSP java API。有人能告诉我为什么float pitchInHz不会被以下代码中的方法freq()更新吗?有人可以告诉我要改变什么来让它发挥作用,因为我不明白为什么它不是。谢谢

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();
            }
        }
    });
}

}

1 个答案:

答案 0 :(得分:0)

大概是因为pitchInHz = result.getPitch();在执行pitch.getPitch()时尚未执行。这是完全可能的,因为这段代码在新线程中同时执行,并且在该线程启动后立即调用pitch.getPitch(),而不是让库随时执行回调。

方法返回0,因为float pitchInHz;float pitchInHz = 0.0f;

相同