我编写了一个用于测试目的的小型Java应用程序,它可以在ubuntu 12.04上从混音器中捕获声音.
代码工作正常,我可以从所有应用程序捕获声音,除了在Wine下运行的任何东西.
每当我启动我的程序时,在启动Wine之后,呼叫targetDataLine.read()
将永远阻止
当Wine没有在后台运行时,它会0
在没有输入时正确输出,或者如果有输入则读取字节数,如预期的那样.
如果我在启动Wine之前启动我的程序,那么声音驱动程序将无法在wine中使用.
我尝试过使用Alsa提供的混音器以及默认设备,结果相同.
我可以想象葡萄酒会以某种方式锁定Alsa(无论出于何种原因),但为什么一个简单的调用会TargetDataLine.read()
导致Wine中的声音失败?
mixerInfo[0]
在我的系统btw上是默认的,并且应用程序当然总是使用oracle的最新JRE(7)在Wine之外运行.
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, …
Run Code Online (Sandbox Code Playgroud) 我编写了一个Java程序,它读入一个包含要执行的命令的文件(用我自己编写的语言).命令以字符串形式读入并放入数组中.现在,"调度程序" - 方法将循环遍历数组,解释命令并调用将对其执行操作的相应方法.
这当然导致了一大堆嵌套的if语句:
if commandReadIn == this, do that...
if commandReadIn is of type x, get next element,treat next element as argument...
etc.
Run Code Online (Sandbox Code Playgroud)
现在我只有一些命令,但如果我想添加数百个呢?代码将变得无法维护.
现在我想知道是否可以完全摆脱条件逻辑.这里的命令模式似乎没什么用,因为我不得不在某个时候解释字符串..这意味着很多嵌套的"if".如果不可能,那么以一种能够轻松添加,编辑或删除命令的方式重构命令及其语法的最佳方法是什么?