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);
}
}
Puoi fornire, nel post, l'output del programma in entrambi gli scenari, quando Wine è in esecuzione, e quando Wine non è in esecuzione. –
Penso che l'uso di DataLine :: disponibile potrebbe aiutare con il blocco. – IceGlow
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