2016-03-24 5 views
0

Я использую API-интерфейс tarsos DSP java. Может ли кто-нибудь сказать мне, почему float pitchInHz не обновляется методом 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(). Это вполне возможно, так как эта часть кода одновременно выполняется в новом потоке, и pitch.getPitch() вызывается сразу же после запуска этого потока, не давая библиотеке времени на выполнение обратного вызова.

Метод возвращается 0, так как float pitchInHz; такая же, как float pitchInHz = 0.0f;

+0

Как бы я изменить вызов методов в убедитесь, что pitchInHz изменилось перед печатью его значения? –

+0

@ G.Mcc Вместо создания потока ('new Thread (dispatcher, ...). Start()') вызывает диспетчера непосредственно 'dispatcher.run()'. Хотя я не знаю, вернется ли это, так как я не знаю библиотеки. Или делайте то, что вы хотите сделать в обратном вызове, вместо того, чтобы передавать его через переменную. – Kiskae

+0

Ye Я пробовал это раньше, и он просто устанавливает значение -1, которое является значением по умолчанию, если ни один шаг не обнаружен, поэтому он никогда не запускается. Я, надеюсь, решит это. Спасибо за вашу помощь –