2017-12-03 28 views
0
package sounds; 

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.io.BufferedInputStream; 
import java.io.IOException; 
import java.util.HashMap; 
import javax.sound.sampled.*; 
import javax.swing.*; 

@SuppressWarnings("serial") 
public class Playlist 
{ 

    private Clip activeClip; 

    /** 
    * Creates an audio clip from a sound file. 
    */ 
    public Clip createClip (String soundFile) 
    { 
     String fileName = "/sounds/" + soundFile + ".wav"; 
     try (BufferedInputStream sound = new BufferedInputStream(getClass().getResourceAsStream(fileName))) 
     { 
      // Create and return a Clip that will play a sound file. There are 
      // various reasons that the creation attempt could fail. If it 
      // fails, return null. 
      Clip clip = AudioSystem.getClip(); 
      clip.open(AudioSystem.getAudioInputStream(sound)); 
      return clip; 
     } 
     catch (LineUnavailableException e) 
     { 
      return null; 
     } 
     catch (IOException e) 
     { 
      return null; 
     } 
     catch (UnsupportedAudioFileException e) 
     { 
      return null; 
     } 
    } 

    public void play (String sound) 
    { 
     Clip clip = createClip(sound); 
     if (clip != null) 
     { 
      if (clip.isRunning()) 
      { 
       clip.stop(); 
      } 
      clip.setFramePosition(0); 
      clip.start(); 
     } 
    } 

    public void startLoop (String sound) 
    { 
     Clip clip = createClip(sound); 
     if (clip != null) 
     { 
      if (clip.isRunning()) 
      { 
       clip.stop(); 
      } 
       clip.setFramePosition(0); 
       clip.loop(Clip.LOOP_CONTINUOUSLY); 
       activeClip = clip; 
     } 
    } 

    public void stopLoop() 
    { 
     if (activeClip != null) { 
      if (activeClip.isRunning()) { 
      activeClip.stop(); 
      } 
     } 
    } 

} 

私の主な問題はループにあります。 1つのオブジェクトが1つのオーディオファイルでループを開始すると、開始されて正常に停止しますが、2つのオブジェクトが同時にstartLoopを呼び出すと、最新のものだけが停止し、もう一方のオブジェクトは続行されます。私は各クリップをHashMapに名前を付けることを考えたので、各クリップを名前で区別することができますが、どのようにNullPointerExceptionエラーが発生するかは関係ありません。Java複数のオーディオループの再生を停止する方法

ここでは、それをHashMapに入れてみてください。 本質的に似ているコードですが、再生または開始ループが呼び出されるたびに、文字列がキーとして機能し、ループを停止するために後で検索できるようにクリップが保存されます。しかし、私はラインでNullPointerExceptionが取得私はこれを行うたびに、私は地図に入れしようとした。

package sounds; 

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.io.BufferedInputStream; 
import java.io.IOException; 
import java.util.HashMap; 
import javax.sound.sampled.*; 
import javax.swing.*; 

@SuppressWarnings("serial") 
public class Playlist 
{ 

    //private Clip activeClip; 

    //Here 
    private HashMap<String, Clip> list; 

    /** 
    * Creates an audio clip from a sound file. 
    */ 
    public Clip createClip (String soundFile) 
    { 
     String fileName = "/sounds/" + soundFile + ".wav"; 
     // Opening the sound file this way will work no matter how the 
     // project is exported. The only restriction is that the 
     // sound files must be stored in a package. 
     try (BufferedInputStream sound = new BufferedInputStream(getClass().getResourceAsStream(fileName))) 
     { 
      Clip clip = AudioSystem.getClip(); 
      clip.open(AudioSystem.getAudioInputStream(sound)); 
      return clip; 
     } 
     catch (LineUnavailableException e) 
     { 
      return null; 
     } 
     catch (IOException e) 
     { 
      return null; 
     } 
     catch (UnsupportedAudioFileException e) 
     { 
      return null; 
     } 
    } 

    public void play (String sound) 
    { 
     Clip clip = createClip(sound); 
     //Here 
     list.put(sound, clip); 
     if (clip != null) 
     { 
      if (clip.isRunning()) 
      { 
       clip.stop(); 
      } 
      clip.setFramePosition(0); 
      clip.start(); 
     } 
    } 

    public void startLoop (String sound) 
    { 
     Clip clip = createClip(sound); 
     //Here 
     list.put(soundFile, clip); 
     if (clip != null) 
     { 
      if (clip.isRunning()) 
      { 
       clip.stop(); 
      } 
       clip.setFramePosition(0); 
       clip.loop(Clip.LOOP_CONTINUOUSLY); 
     } 
    } 

    public void stopLoop (String sound) 
    { 
     //Here 
     Clip clip = (Clip) list.get(sound); 
     if (clip != null) { 
      if (clip.isRunning()) { 
      clip.stop(); 
      } 
     } 
    } 

} 
+0

あなたのコードの 'HashMap'バージョンを教えてください。 – Izruo

+0

コードを更新しました – tlqkfsusdk

答えて

0

あなたが「リスト」という名前のHashMapをインスタンス化しませんでした。

private HashMap<String, Clip> list = new HashMap<>(); 
+0

ええと...そんなに愚かな間違い。それは私がそれを見てこれを長くかかったと信じられない – tlqkfsusdk

関連する問題