我在处理中编写了一个程序,它使用外部库“Minim”进行音频播放。我是这个图书馆的新手,所以我对图书馆的理解相当平淡。我的程序可以运行几天没有问题,但最终我会收到以下错误:
Emblems_Sounds.pde:42:0:42:0: OutOfMemoryError: Java heap space OutOfMemoryError: 您可能需要在首选项中增加内存设置。OutOfMemoryError 意味着您的代码由于错误而占用了太多内存,或者您的草图可能需要更多内存才能运行。
我在我的代码中引用了大约 20 个音频文件,范围从 500 KB 到 5MB,大多数在 1MB 左右。我的最大可用内存在处理 IDE 中设置为 2000 MB,这似乎绰绰有余。因此,我的假设是我有一个错误,我相信这个错误是我无意中将这些音频文件一遍又一遍地加载到新的内存位置,而不是重新分配它们的内存空间。我很难通过查看我的代码来弄清楚我是如何做到的。同样,我对 Minim 不太熟悉,所以我不了解这个库的微妙之处以及我可能会如何做一些导致内存泄漏的事情。我对 Processing/Java 也很陌生。如果任何更精通 Processing/Java/Minim 的人可以查看我的代码并指出一些会引发一些危险信号的行,我将不胜感激。
关于我的代码的一些相关信息:这只是 3 文件系统中的一个文件。此文件仅控制程序的音频应用程序。我有十个触摸传感器和一个触发音频和照明事件的唯一 3 个组合代码列表。这些事件将音频文件映射到 PC 识别为声卡的不同 Dante 设备。当事件发生时,我将音频路由到正确的 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();
}
}