我需要关闭音频剪辑吗?

Mic*_*ael 1 java audio memory-leaks

有一个处理实时数据的应用程序,该应用程序应在发生特定事件时发出蜂鸣声。触发事件每秒可能发生多次,并且如果在另一个事件触发时蜂鸣声已经在播放,则代码应该忽略它(与中断当前蜂鸣声并开始新的蜂鸣声相反)。这是基本代码:

Clip clickClip

public void prepareProcess() {
    super.prepareProcess();

    clickClip = null;

    try {
        clipFile = new File("C:/WINDOWS/Media/CHIMES.wav");
        ais = AudioSystem.getAudioInputStream(clipFile);
        clickClip = AudioSystem.getClip();
        clickClip.open(ais);

        fileIsLoaded = true;

    } catch (Exception ex) {
        clickClip = null;
        fileIsLoaded = false;
    }
}

public void playSound() {

    if (fileIsLoaded) {

        if ((clickClip==null) || (!clickClip.isRunning())) {

            try {
                clickClip.setFramePosition(0);
                clickClip.start();
            } catch (Exception ex) {
                System.out.println("Cannot play click noise");
                ex.printStackTrace();
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

prepareProcess方法从头开始运行一次,并且每次触发事件发生时都会调用pl​​aySound方法。我的问题是:是否需要关闭clickClip对象?我知道我可以添加一个actionListener来监视Stop事件,但是由于该事件频繁发生,我担心额外的处理会减慢实时数据收集的速度。

该代码似乎运行良好,但我担心的是内存泄漏。上面的代码基于我在网上搜索时发现的示例,但是该示例使用了一个actionListener来专门关闭Clip,“以消除未实现stop方法时发生的内存泄漏”。我的程序打算运行几个小时,所以我遇到的任何内存泄漏都会引起问题。

老实说:我不知道如何验证我是否有问题。我正在使用Netbeans,并且运行内存事件探查器只是给了我一大堆我不知道如何阅读的内容。这应该是该程序的简单部分,而我正在花费数小时。任何帮助将不胜感激!

麦可

dat*_*aki 5

是的,必须关闭

  myClip.addLineListener(new LineListener() {
    public void update(LineEvent myLineEvent) {
      if (myLineEvent.getType() == LineEvent.Type.STOP)
        myClip.close();
    }
  });
Run Code Online (Sandbox Code Playgroud)

  if (!myClip.isRunning())
    myClip.close();
Run Code Online (Sandbox Code Playgroud)

在我的应用程序(在util.concurrent出现之前编写)中,这是剪辑关闭机制。

  public static final Vector<Clip> vector = new Vector<Clip>();
  static final int vector_size = 5;

  // typically called before calling play()
  static synchronized void consolidate() {
    while (vector_size < vector.size()) {
      Clip myClip = vector.get(0);
      if (myClip.isRunning())
        break;
      myClip.close();
      vector.remove(0);
    }
    if (vector_size * 2 < vector.size())
      System.out.println("warning: audio consolidation lagging");
  }

  public static void play(final File myFile) {
    try {
      AudioInputStream myAudioInputStream = AudioSystem.getAudioInputStream(myFile);
      final Clip myClip = AudioSystem.getClip();
      vector.add(myClip);
      myClip.open(myAudioInputStream);
      myClip.start();
    } catch (Exception myException) {
      myException.printStackTrace();
    }
  }
Run Code Online (Sandbox Code Playgroud)

就像其中一条评论所暗示的那样,它可能会延迟新剪辑的播放,但我不记得了,因为几毫秒的延迟在我的应用程序中并不重要。