Napisałem małą aplikację Java do testowania, która przechwytuje dźwięk z miksera na Ubuntu 12.04.Przechwytywanie dźwięku z Wine z TargetDataLine
Kod działa poprawnie, mogę przechwytywać dźwięk ze wszystkich aplikacji, z wyjątkiem działania pod Wine.
Ilekroć rozpocząć mój program, po uruchomieniu Wine, wywołanie targetDataLine.read()
zablokuje zawsze
Kiedy wino nie jest uruchomiony w tle, to poprawnie wyprowadza 0
gdy nie ma sygnału, czy liczba bajtów przeczytaj, jeśli jest wejście, zgodnie z oczekiwaniami.
Jeśli uruchomię program przed uruchomieniem Wine, sterownik dźwięku nie będzie dostępny w winie.
Próbowałem używać zarówno mikserów dostarczonych przez Alsa, jak i domyślnego urządzenia, ten sam wynik.
Mogę sobie wyobrazić, że wino w jakiś sposób blokuje Alsę (z jakiegokolwiek powodu), ale dlaczego proste połączenie z TargetDataLine.read()
spowoduje, że dźwięk zawodzi w Wine? mixerInfo[0]
jest domyślnie na moim systemie btw, a aplikacja oczywiście zawsze działa poza Wine przy użyciu najnowszego JRE Oracle'a (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);
}
}
Czy możesz podać w poście wynik programu w obu scenariuszach, kiedy Wine jest uruchomiony, a kiedy Wine nie działa. –
Myślę, że korzystanie z DataLine :: available może pomóc w blokowaniu. – IceGlow
Sprawdź konfigurację Wine, aby zobaczyć, jak uzyskuje dostęp do dźwięku. http://askubuntu.com/questions/77210/how-to-change-the-default-audio-in-wine-to-als-only – IceGlow