sonido reproducir poner como java linux audio alsa wine

reproducir - como poner sonido en java eclipse



Captura de sonido del vino con TargetDataLine (1)

Haga uso del método AudioSystem.write (). Es mucho mas facil

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

He escrito una pequeña aplicación de Java para fines de prueba que captura el sonido de un mezclador en ubuntu 12.04.

El código funciona bien, puedo capturar el sonido de todas las aplicaciones a excepción de cualquier cosa que se ejecute en Wine.

Cada vez que inicio mi programa, después de haber iniciado Wine, la llamada a targetDataLine.read() bloqueará para siempre

Cuando Wine no se ejecuta en segundo plano, muestra correctamente 0 cuando no hay entrada, o el número de bytes leídos si hay entrada, como se esperaba.

Si inicio mi programa antes de iniciar Wine, el controlador de sonido no estará disponible dentro del vino.

He intentado usar tanto los mezcladores proporcionados por Alsa como el dispositivo predeterminado, el mismo resultado.

Podría imaginar que el vino de alguna manera bloquea a Alsa (por alguna razón), pero ¿por qué una simple llamada a TargetDataLine.read() haría que el sonido fallara en Wine? mixerInfo[0] está predeterminado en mi sistema por cierto, y la aplicación siempre se está ejecutando fuera de Wine utilizando el último JRE de 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); } }