小编Dom*_*ler的帖子

使用TargetDataLine捕获Wine中的声音

我编写了一个用于测试目的的小型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 linux audio wine alsa

49
推荐指数
1
解决办法
1338
查看次数

迭代执行命令列表 - 哪个模式?

我编写了一个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".如果不可能,那么以一种能够轻松添加,编辑或删除命令的方式重构命令及其语法的最佳方法是什么?

java design-patterns strategy-pattern command-pattern

3
推荐指数
1
解决办法
1801
查看次数