2012-07-18 10 views
48

Ho scritto una piccola applicazione Java a scopo di test che cattura l'audio da un mixer su Ubuntu 12.04.Cattura audio da Wine con TargetDataLine

Il codice funziona correttamente, sono in grado di catturare il suono da tutte le applicazioni tranne che per qualsiasi applicazione in esecuzione su Wine.

Ogni volta che inizio il mio programma, dopo aver vino ha iniziato, la chiamata a targetDataLine.read() bloccherà per sempre

quando il vino non è in esecuzione in background, emette correttamente 0 quando non v'è alcun ingresso, o il numero di byte leggi se c'è un input, come previsto.

Se avvio il mio programma prima di avviare Wine, il driver audio non sarà disponibile nel vino.

Ho provato ad utilizzare sia i mixer forniti da Alsa sia il dispositivo predefinito, stesso risultato.

Potrei immaginare che il vino blocca in qualche modo Alsa (per qualsiasi motivo), ma perché una semplice chiamata a TargetDataLine.read() causerà il fallimento del suono in Wine? mixerInfo[0] è di default sul mio sistema btw, e naturalmente l'applicazione è sempre in esecuzione fuori da Wine usando l'ultimo JRE di Oracle (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

Puoi fornire, nel post, l'output del programma in entrambi gli scenari, quando Wine è in esecuzione, e quando Wine non è in esecuzione. –

+0

Penso che l'uso di DataLine :: disponibile potrebbe aiutare con il blocco. – IceGlow

+2

Controlla la configurazione di Wine per vedere come accede all'audio. http://askubuntu.com/questions/77210/how-to-change-the-default-audio-in-wine-to-alsa-only – IceGlow

risposta

1

Utilizzare il metodo AudioSystem.write(). È molto più semplice

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. Ho notato la data della domanda solo ora ... –