2012-07-18 33 views
48

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); 
    } 
} 
+2

Czy możesz podać w poście wynik programu w obu scenariuszach, kiedy Wine jest uruchomiony, a kiedy Wine nie działa. –

+0

Myślę, że korzystanie z DataLine :: available może pomóc w blokowaniu. – IceGlow

+2

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

Odpowiedz

1

Należy użyć metody AudioSystem.write(). O wiele łatwiej jest uzyskać

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); 
+0

Oh. Zauważyłem datę pytania tylko teraz ... –