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();
}
}
}
}
あなたのコードの 'HashMap'バージョンを教えてください。 – Izruo
コードを更新しました – tlqkfsusdk