Подтвердить что ты не робот

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

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

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

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

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

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

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

Я мог себе представить, что вино каким-то образом блокирует Алсу (по какой-то причине), но почему простой вызов targetDataLine.read() заставляет звук терпеть неудачу в Wine? mixerInfo[0] по умолчанию используется в моей системе btw, и приложение, конечно же, всегда работает за пределами 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);
   }
}
4b9b3361

Ответ 1

Использовать метод AudioSystem.write(). Это намного проще

targetDataLine.open(format);
targetDataLine.start();
AudioInputStream ais=new AudioInputStream(targetDataLine);
AudioFileFormat.Type fileformat=AudioFileFormat.Type.WAVE;
/*
Other Audio file formats supported:
AudioFileFormat.Type.AU
AudioFileFormat.Type.AIFF
AudioFileFormat.Type.AIFC
AudioFileFormat.Type.SND
*/
File audoutputfile=new File('myfile');
//adjust extension according to AudioFileFormat
AudioSystem.write(ais,fileformat, audoutputfile);