Java 使用TargetDataLine捕捉葡萄酒中的声音

Java 使用TargetDataLine捕捉葡萄酒中的声音,java,linux,audio,alsa,wine,Java,Linux,Audio,Alsa,Wine,我已经为测试目的编写了一个小型Java应用程序,它可以从ubuntu 12.04上的混音器中捕获声音 代码运行良好,我可以从所有应用程序捕获声音,除了在Wine下运行的任何应用程序 每当我启动程序时,在启动Wine之后,对targetDataLine.read()的调用将永远被阻止 当Wine未在后台运行时,如果没有输入,它将正确输出0,如果有输入,它将正确输出读取的字节数,如预期的那样 如果我在启动Wine之前启动程序,Wine中的声音驱动程序将不可用 我尝试使用Alsa提供的混音器和默认设备

我已经为测试目的编写了一个小型Java应用程序,它可以从ubuntu 12.04上的混音器中捕获声音

代码运行良好,我可以从所有应用程序捕获声音,除了在Wine下运行的任何应用程序

每当我启动程序时,在启动Wine之后,对
targetDataLine.read()
的调用将永远被阻止

当Wine未在后台运行时,如果没有输入,它将正确输出
0
,如果有输入,它将正确输出读取的字节数,如预期的那样

如果我在启动Wine之前启动程序,Wine中的声音驱动程序将不可用

我尝试使用Alsa提供的混音器和默认设备,结果相同

我可以想象wine会以某种方式锁定Alsa(无论出于何种原因),但为什么对
TargetDataLine.read()
的简单调用会导致wine中的声音失败?
mixerInfo[0]
是我的系统的默认设置,当然,应用程序总是使用oracle最新的JRE(7)在Wine之外运行

private void readSound()
{
字节tempBuffer[]=新字节[10000];
int-cnt=0;
Mixer.Info[]mixerInfo=AudioSystem.getMixerInfo();
System.out.println(“可用混合器:”);
for(int p=0;p
使用AudioSystem.write()方法。这要容易得多

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

请在帖子中提供两种情况下的程序输出,即Wine运行时和Wine未运行时。我认为使用DataLine::available可能有助于阻止。请检查Wine的配置,查看它如何访问音频。
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);