1

さて、ボタンがクリックされると曲を再生するプログラムに取り組んでいます。コードがダウンしていて、ボタンがクリックされるとオーディオが再生されますが、現在の唯一の問題は、プログラムが完全に狂ってしまうことです。ボタンがクリックされたときにオーディオを再生します!!!! プログラムはオーディオをフリーズし続けますが、プログラムは他の機能を実行しません!私は何が間違っているのですか?どうすれば修正できますか?

アクションリスナーボタンのコードは次のとおりです

myFrame.javaで

sound sound = new sound();
private File pokemonBattle = new File(".\\audio\\"+"sound.wav");


private void dualButtonActionPerformed(java.awt.event.ActionEvent evt)       
    {                                           
    // TODO add your handling code here:
    for (int i = 0; i<1; i++){
    c = deck.getNextCard();
    p1hand[i] = c;
    p1.setCard(c);                   //ignore all this
    c = deck.getNextCard();
    p2hand[i] = c;
    p2.setCard(c);
     }

    pokemon1.setEnabled(true);
    pokemon2.setEnabled(true);
    pokemon1.setIcon(p1hand[0].getImage()); //ignore all this as well
    pokemon2.setIcon(p2hand[0].getImage());
    textArea.setText("Pokemon 1:"+p1hand[0].toString()+"\nPokemon 2:   
 "+p2hand[0].toString());
    p1ResultLabel.setText("");
    p2ResultLabel.setText("");

      //this is where im calling my audio
     sound.playAudio(pokemonBattle);//this is where im calling my play audio method

 }

playAudio()があるsound.java

import java.io.File;
import javax.sound.sampled.*;



public class sound {

public void playAudio(File sf){
    AudioFormat audioFormat;
    AudioInputStream audioInputStream;
    SourceDataLine sourceDataLine;

    try
    {
        audioInputStream = AudioSystem.getAudioInputStream(sf);
        audioFormat = audioInputStream.getFormat();
        System.out.println(audioFormat);

        DataLine.Info dataLineInfo = new  
  DataLine.Info(SourceDataLine.class,audioFormat);

        sourceDataLine =(SourceDataLine)AudioSystem.getLine(dataLineInfo);

        byte tempBuffer[]=new byte[100000];
        int cnt;
        sourceDataLine.open(audioFormat);
        sourceDataLine.start();
        while((cnt=audioInputStream.read
                     (tempBuffer,0,tempBuffer.length))!=-1){
            if(cnt>0){
                sourceDataLine.write(tempBuffer,0,cnt);
            }

        }

    }
    catch (Exception e)
    {
        e.printStackTrace();
        System.exit(0);
        }
    }

}
4

2 に答える 2

1

別のスレッドでオーディオを再生する必要があります。UIを描画してユーザーの操作に応答する代わりに、イベントディスパッチスレッドでオーディオを再生しているため、プログラムは応答しなくなります。

それ以外の:

sound.playAudio(pokemonBattle);

行う:

Thread t = new Thread( new SoundPlayer( sound, pokemonBattle );
t.start();

そしてまた:

public class SoundPlayer implements Runnable
{
    private final sound sound;
    private final File soundFile;

    public SoundPlayer( sound sound, File soundFile )
    {
        this.sound = sound;
        this.soundFile = soundFile;
    }

    public void run()
    {
       sound.playAudio( soundFile );
    }
}
于 2012-07-10T02:03:19.660 に答える
0

ジョセフは正しいです。しかし、この場合の問題は

 while((cnt=audioInputStream.read
                     (tempBuffer,0,tempBuffer.length))!=-1){
            if(cnt>0){
                sourceDataLine.write(tempBuffer,0,cnt);
            }

        }

whileループは無限に実行されるため、アプリケーションがフリーズします。バッファ全体を一度に読み書きしているので、whileループは必要ありません。ループの外側でこれを行うと、問題ありません。

于 2012-07-10T02:09:34.113 に答える