Захват звука из Wine с помощью TargetDataLine

Я написал небольшое Java-приложение для тестирования, которое захватывает звук из микшера на Ubuntu 12.04.

Код работает нормально, я могу записывать звук из всех приложений, кроме тех, что работают под Wine.

Всякий раз, когда я запускаю свою программу после запуска Wine, вызов targetDataLine.read()блокируется навсегда

Когда Wine не работает в фоновом режиме, он корректно выводит 0при отсутствии ввода или количество прочитанных байтов при наличии ввода, как и ожидалось.

Если я запущу свою программу до запуска Wine, звуковой драйвер будет недоступен в Wine.

Я пробовал использовать как микшеры, предоставляемые Alsa, так и устройство по умолчанию, результат тот же.

Я мог бы представить, что Wine каким-то образом блокирует Alsa (по какой-то причине ), но почему простой вызов TargetDataLine.read()может привести к сбою звука в Wine? Кстати, mixerInfo[0]по умолчанию используется в моей системе, и приложение, конечно же, всегда работает вне Wine, используя последнюю версию JRE (7 )оракула.

private void readSound ()
{
    byte tempBuffer[] = new byte[10000];
    int cnt = 0;
    Mixer.Info[] mixerInfo = AudioSystem.getMixerInfo();

    System.out.println("Available mixers:");
    for (int p = 0; p < mixerInfo.length; p++)
        System.out.println(mixerInfo[p].getName());

    format = getAudioFormat();
    DataLine.Info dataLineInfo = new DataLine.Info(TargetDataLine.class, format);
    Mixer mixer = AudioSystem.getMixer(mixerInfo[0]);

    try
    {
         targetDataLine = (TargetDataLine) mixer.getLine(dataLineInfo);
         targetDataLine.open(format);
    }
    catch(Exception e)
    {
        e.printStackTrace();
    }
    targetDataLine.start();

    while (true)
    {
        i++;
        cnt = targetDataLine.read(tempBuffer, 0, tempBuffer.length);
        System.out.println("read " + cnt + " bytes:" + tempBuffer[i]);            
        calculateLevel(tempBuffer, 0, 200);
        targetDataLine.flush();
        System.out.println(level);
   }
}
49
задан Khaled.K 6 December 2015 в 01:04
поделиться