Java-апплет Lotus Notes аварийно завершает работу с исключением "Формат строки не поддерживается"
У меня проблемы с "неподдерживаемым форматом строки" в моем апплете для записи звука, который я использую в документе Lotus Notes. Выдается следующее исключение (ТОЛЬКО когда я запускаю апплет в Lotus Document, когда он выполняется в JavaAppetViewr, все просто идеально):
javax.sound.sampled.LineUnavailableException: line with format PCM_SIGNED 16000.0 Hz, 16 bit, mono, 2 bytes/frame, little-endian not supported.
at com.sun.media.sound.DirectAudioDevice$DirectDL.implOpen(DirectAudioDevice.java:506)
at com.sun.media.sound.AbstractDataLine.open(AbstractDataLine.java:119)
at com.sun.media.sound.AbstractDataLine.open(AbstractDataLine.java:151)
Это происходит не всегда, хотя. Просто время от времени, иногда после того, как приложение много работает, в другой раз в начале работы и пропадает через некоторое время.
Вот исходный код:
mRecClip = new RecClip(clipFile, new AudioFormat(16000, 16, 1, false, false));
// _ctor
public RecClip(File file, AudioFormat format) throws IOException, Exception
{
mOutputStream = new ByteArrayOutputStream(8388608);
mFile = file;
if (mFile.exists())
mFile.delete();
mFile.createNewFile();
mFormat = format;
try {
mClip = AudioSystem.getClip();
} catch (LineUnavailableException lue) {
throw new Exception(lue.getMessage());
}
try {
line = AudioSystem.getTargetDataLine(mFormat);
mInputStream = new AudioInputStream(line);
} catch (Exception iae) {
lns = selectLine(mFormat);
if (lns != null)
{
line = lns.Line;
mInputStream = lns.Stream;
}
else throw new Exception("\nCompatible format not found\n");
} // end of catch
} // end of _ctor
И метод, который называется:
private LineNStream selectLine(AudioFormat format) {
for (Mixer.Info mInfo : AudioSystem.getMixerInfo()) {
Mixer m = AudioSystem.getMixer(mInfo);
for (Line.Info lInfo : m.getTargetLineInfo()) {
try {
if (lInfo.getLineClass().equals(TargetDataLine.class)) {
DataLine.Info dInfo = (DataLine.Info) lInfo;
for (AudioFormat f: dInfo.getFormats()) {
if (AudioSystem.isConversionSupported(format, f)) {
try {
TargetDataLine candidate = (TargetDataLine) m.getLine(dInfo);
AudioFormat specifiedFormat = new AudioFormat(f.getEncoding(), format.getSampleRate(), f.getSampleSizeInBits(), f.getChannels(), f.getFrameSize(), format.getSampleRate(), f.isBigEndian());
candidate.open(specifiedFormat);
AudioInputStream baseStream = new AudioInputStream(candidate);
return new LineNStream(candidate, AudioSystem.getAudioInputStream(format, baseStream));
} catch (IllegalArgumentException iae1) {
iae1.printStackTrace();
}
}
}
}
} catch (LineUnavailableException lue) {
lue.printStackTrace();
}
}
}
return null;
}
Итак, здесь идут вопросы:)
Я делаю что-то не так, получая совместимый аудиоформат со значениями, переданными в конструктор? Может быть, я должен выпустить какие-либо ресурсы, звуковые линии и т. Д. (Сама запись выполняется в другом потоке)?
Или, может быть, я могу получить AudioFormat, который точно поддерживается входными данными, используя некоторые методы из библиотеки?
Спасибо за чтение этой стены текста, я буду очень признателен за вашу помощь.