Java-апплет Lotus Notes аварийно завершает работу с исключением «Формат строки не поддерживается» - PullRequest
0 голосов
/ 13 января 2012

У меня проблемы с "неподдерживаемым форматом строки" в моем апплете для записи звука, который я использую в документе 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. Я что-то не так получаю, получая совместимый аудиоформат со значениями, передаваемыми в конструктор? Может быть, я должен освободить любые ресурсы, звуковые линии e.t.c. (сама запись выполняется в другом потоке)?

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

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

...