Почему метод не обновляет значение переменной?

Я использую 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 ответ

Предположительно потому что pitchInHz = result.getPitch(); не был выполнен к тому времени, когда вы выполняете pitch.getPitch(), Это вполне возможно, поскольку этот фрагмент кода одновременно выполняется в новом потоке и pitch.getPitch() вызывается сразу после запуска этого потока, не давая библиотеке времени для выполнения обратного вызова.

Метод вернул 0, так как float pitchInHz; такой же как float pitchInHz = 0.0f;

Другие вопросы по тегам