使用minim库导致outofmemoryerror

ca1c2owp  于 2021-06-30  发布在  Java
关注(0)|答案(0)|浏览(254)

我在processing中编写了一个程序,使用外部库“minim”进行音频播放。我是新来这家图书馆的,所以我对图书馆的了解相当缺乏。我的程序可以正常运行几天,但最终会出现以下错误:
标志和声音。pde:42:0:42:0:outofmemoryerror:java堆空间outofmemoryerror:您可能需要增加首选项中的内存设置。outofmemoryerror意味着您的代码由于错误而占用了太多内存,或者您的草图可能需要更多内存才能运行。
在我的代码中,我引用了大约20个音频文件,范围从500KB到5mb,大多数都在1mb左右。在处理ide中,我的最大可用内存设置为2000MB,这似乎已经足够了。因此,我的假设是,我有一个错误,我相信,错误是我无意中加载这些音频文件一遍又一遍到新的内存位置,而不是重新分配他们的内存空间。我很难通过查看代码来弄清楚我是如何做到这一点的。再说一次,我对minim不是很精通,所以我不理解这个库的微妙之处,也不知道我是如何做一些导致内存泄漏的事情的。我对processing/java也相当陌生。如果任何更精通processing/java/mini的人都能看看我的代码,并给我指出一些引起危险信号的行,我将不胜感激。
关于我的代码的一些相关信息:这只是3文件系统中的一个文件。此文件仅控制程序的音频应用程序。我有十个触摸传感器和一个独特的3个组合码触发音频和灯光事件列表。这些事件将音频文件Map到不同的dante设备,pc将其识别为声卡。当事件发生时,我将音频路由到正确的dante设备,然后播放音频。另外,在代码的开头,我有多个audiooutput和audioplayer类型的声明,它们没有被使用。这些是错误地加载的(我忘了取出它们),但是我决定在错误发生时保持代码的真实性。

Minim minim1 = new Minim(this);
String danteZone = "";
AudioOutput output1;
AudioOutput output2;
AudioOutput output3;
AudioOutput output4;
AudioOutput output5;
AudioOutput output6;

AudioPlayer player1; 
AudioPlayer player2;
AudioPlayer player3; 
AudioPlayer player4;
AudioPlayer player5; 
AudioPlayer player6;

Mixer.Info[] mixerInfo;

//Variable to play audio 
boolean played = false; 

//Audio variables 
int audioZones = 6; //Will be 6 

void playEffect(String filename, String danteZone){
  Mixer mixer1 = AudioSystem.getMixer(mixerInfo[0]);
  mixerInfo = AudioSystem.getMixerInfo();
  for (int i = 0; i < mixerInfo.length; i++){
    if (mixerInfo[i].getName().equals(danteZone)){
       mixer1 = AudioSystem.getMixer(mixerInfo[i]);
    }
  }

  minim1.setOutputMixer(mixer1);

  if (output1 != null){
    output1.close();
  }

  output1 = minim1.getLineOut(Minim.STEREO);

  player1 = minim1.loadFile(filename);

   if (output1 != null){
     player1.play();
  } 
}

void audioEvent(int code){

  String wav = ".wav";
  String fileName = str(code);
  fileName = fileName + wav;
  println(fileName);
  //Using repetive if statements for code to be clearer

    if (zoneIdentifier[0] == true){
      //Zone 12 
      danteZone = zone12;   
      playEffect(fileName, danteZone);
    }

    if (zoneIdentifier[1] == true){
      //Zone 13 
      danteZone = zone13;     
      playEffect(fileName, danteZone);
    }

    if (zoneIdentifier[2] == true){
      //Zone 14  
      danteZone = zone14;
      playEffect(fileName, danteZone);
    }

    if (zoneIdentifier[3] == true){
      //Zone 15  
      danteZone = zone15;     
      playEffect(fileName, danteZone);
    }

    if (zoneIdentifier[4] == true){
      //Zone 16 
      danteZone = zone16;    
      playEffect(fileName, danteZone);      
    }

    if (zoneIdentifier[5] == true){
      //Zone 17
      danteZone = zone17;
      playEffect(fileName, danteZone);
    }   
  }

void loopAmbience(int i){
  String filename = " ";
  String danteCard = " ";
  //println(mixerInfo[i].getName());
  danteCard = mixerInfo[i].getName();
  //println(danteCard);
  println();
  Mixer mixer1 = AudioSystem.getMixer(mixerInfo[i]);
  if (danteCard.startsWith("Zone14")){
    filename = "Zone14Ambience.wav";
  }
  else if (danteCard.startsWith("Zone17")){
    filename = "Zone17Ambience.wav";
  }
  else if (danteCard.startsWith("Zone12")){
    filename = "Zone12Ambience.wav";
  }
  else{
   return; 
  }

  minim1.setOutputMixer(mixer1);

  if (output1 != null){
    output1.close();
  }

  output1 = minim1.getLineOut(Minim.STEREO);

  player1 = minim1.loadFile(filename);

   if (output1 != null){
     player1.loop();
  } 
}

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题