2017-03-05 21 views
0

大丈夫、私の問題はあります:私のオーディオは正しく再生されますが、 "clip.stop()"または "clip.close()"の後でも止まっていません。それをやめるために何をすべきか? (私もそれをミュートすることができます、私は本当に必死です)javaオーディオ再生が停止しない

public class Main { 
    //audio playing 
    public static void audio(boolean a) { 
     try { 

      File file = new File("textures/Main_theme.wav"); 
      Clip clip = AudioSystem.getClip(); 
      clip.open(AudioSystem.getAudioInputStream(file)); 

      if(a == true){ 
      // this loads correctly, but wont stop music 
      clip.stop(); 
      System.out.println(a); 
      } 
      else{ 
      clip.start(); 

      } 
     } catch (Exception e) { 
      System.err.println("Put the music.wav file in the sound folder if you want to play background music, only optional!"); 
     } 
    } 


    private static String arg; 

    public static void main(String[] args){ 

    //picture loading ... ignorable now 

    arg = "textures/ccc.gif"; 
    JFrame f = new JFrame(); 
    JPanel p = new JPanel(); 
    JLabel l = new JLabel(); 
    ImageIcon icon = new ImageIcon(arg);  
    f.setSize(480, 360); 
    f.setVisible(true); 
    l.setIcon(icon); 
    p.add(l); 
    f.getContentPane().add(p); 
    f.setLocationRelativeTo(null); 
    f.setResizable(false); 
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    //calling audio method to play sound (works) 
    audio(false); 

    //should stop music and run another class 
    KeyListener action = new KeyListener() 
    { 
     @Override 
     public void keyPressed(KeyEvent e) { 
     //trying to stop music 
      f.dispose(); 
      try { 

       Menu.menu(args); 
       Main.audio(true); 

      } catch (IOException e1) { 
      //rest of code ... ignorable  
       e1.printStackTrace(); 
      } 

     } 

     @Override 
     public void keyReleased(KeyEvent e) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void keyTyped(KeyEvent e) { 
      // TODO Auto-generated method stub 

     } 

    }; 
    f.addKeyListener(action); 

     } 
    } 
+0

'stop'を呼び出すと、再生していない' Clip'で 'stop'を呼び出すときに、同じ参照を使用する必要があります – MadProgrammer

答えて

1

あなたは戻って何をやっているのか考えてください。

Clipを作成していて、再生しています。将来的には、新しいClipを作成して試してみてください。これらの2つの接続にはどのような関係がありますか?Clipは共通していますか?彼らはどのようにつながっていますか?答えは、そうではないということです。同じファイルをロードしてClipをセパレートし、個別に再生することは非常に合理的です。

代わりに、先に開始したClipのインスタンスを停止する必要があります。

私は怠惰なので、オーディオ機能を簡単なクラスにカプセル化することから始めます。

public class Audio { 

    private Clip clip; 

    protected Audio() { 
    } 

    public Audio(File source) throws LineUnavailableException, MalformedURLException, IOException, UnsupportedAudioFileException { 
     this(source.toURI().toURL()); 
    } 

    public Audio(URL source) throws LineUnavailableException, IOException, UnsupportedAudioFileException { 
     this(source.openStream()); 
    } 

    public Audio(InputStream source) throws LineUnavailableException, IOException, UnsupportedAudioFileException { 
     init(source); 
    } 

    protected void init(File source) throws LineUnavailableException, MalformedURLException, IOException, UnsupportedAudioFileException { 
     init(source.toURI().toURL()); 
    } 

    protected void init(URL source) throws IOException, LineUnavailableException, UnsupportedAudioFileException { 
     init(source.openStream()); 
    } 

    protected void init(InputStream source) throws LineUnavailableException, IOException, UnsupportedAudioFileException { 
     clip = AudioSystem.getClip(); 
     clip.open(AudioSystem.getAudioInputStream(source)); 
    } 

    public void setRepeats(boolean repeats) { 
     clip.loop(repeats ? Clip.LOOP_CONTINUOUSLY : 1); 
    } 

    public void reset() { 
     clip.stop(); 
     clip.setFramePosition(0); 
    } 

    public void play() { 
     clip.start(); 
    } 

    public void stop() { 
     clip.stop(); 
    } 

    public boolean isPlaying() { 
     return clip.isActive(); 
    } 
} 

「なぜですか?」今、私は気にしたり、オーディオのソースは、例えば、何を覚えておく必要がなく、特定の音を表現し、それらをロードサブクラスを作成することができますので、あなたは、私が簡単に作成することができ、今...、

public class MainTheme extends Audio { 

    public MainTheme() throws LineUnavailableException, MalformedURLException, IOException, UnsupportedAudioFileException { 
     init(getClass().getResource("textures/Main_theme.wav")); 
    } 

} 

を尋ねますそれのソースはこれも私は単に経営Audioのと負荷オフのインスタンスを期待するプログラムの他の部分にMainThemeを渡すことができることを意味

が何であるかを気にすることなく、「メインテーマ」オーディオIがする必要がある時はいつでも

次に、クラスのインスタンスを作成し、start/sto例えば、必要に応じて...

+0

に 'stop'と呼ばれていた' Clip'を、お世話になりました。あなたのサブクラスにいくつかの問題があります。明示的にコンストラクタを呼び出す "...あなたはこれを修正する方法を知っていますか? –

+0

あなたは – MadProgrammer

+0

を含むMainThemeクラスをコピーしましたか?それを最後のオーディオクラス "}"の下に置いてください(私は本当に愚かなプログラマーbtwですので、ごめんなさい: ')) –

関連する問題