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;
}

Итак, здесь идут вопросы:)

  1. Я делаю что-то не так, получая совместимый аудиоформат со значениями, переданными в конструктор? Может быть, я должен выпустить какие-либо ресурсы, звуковые линии и т. Д. (Сама запись выполняется в другом потоке)?

  2. Или, может быть, я могу получить AudioFormat, который точно поддерживается входными данными, используя некоторые методы из библиотеки?

Спасибо за чтение этой стены текста, я буду очень признателен за вашу помощь.

0 ответов

Другие вопросы по тегам