Я написал небольшое приложение 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);
}
}