Capture du son de Wine avec TargetDataLine

J’ai écrit une petite application Java à des fins de test qui capture le son d’une console de mixage sur Ubuntu 12.04.

Le code fonctionne bien, je peux capturer le son de toutes les applications, sauf pour tout ce qui tourne sous Wine.

Chaque fois que je lance mon programme, après avoir démarré Wine, l’appel à targetDataLine.read() sera bloqué pour toujours

Lorsque Wine ne s’exécute pas en arrière-plan, il génère correctement 0 lorsqu’il n’y a pas d’entrée, ou le nombre d’octets lu s’il y a des entrées, comme prévu.

Si je lance mon programme avant de démarrer Wine, le pilote audio ne sera pas disponible dans Wine.

J’ai essayé d’utiliser les deux mélangeurs fournis par Alsa ainsi que le périphérique par défaut, même résultat.

Je pourrais imaginer que le vin verrouille en quelque sorte Alsa (pour quelque raison que ce soit), mais pourquoi un simple appel à TargetDataLine.read() échouer le son dans Wine? mixerInfo[0] est la valeur par défaut de mon système btw, et l’application est bien sûr toujours exécutée en dehors de Wine à l’aide du dernier JRE (7) d’Oracle.

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

    Utilisez la méthode AudioSystem.write (). C’est beaucoup plus facile

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