我寫了一個小型的Java應用程序用於測試目的,它從ubuntu 12.04上的混音器捕獲聲音。用TargetDataLine從Wine中捕獲聲音
該代碼工作正常,我可以捕獲除了在Wine下運行的所有應用程序的聲音。
每當我開始我的計劃,已經開始葡萄酒後,調用targetDataLine.read()
將永遠阻止
當酒不是在後臺運行,它正確輸出0
當沒有輸入,或字節數如預期的那樣閱讀是否有輸入。
如果我在啓動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, 0, tempBuffer.length);
System.out.println("read " + cnt + " bytes:" + tempBuffer[i]);
calculateLevel(tempBuffer, 0, 200);
targetDataLine.flush();
System.out.println(level);
}
}
你可以請在這個帖子中提供這兩種情況下的程序輸出,Wine運行時和Wine沒有運行的情況。 – 2015-12-06 11:05:38
我認爲使用DataLine :: available可能有助於阻止。 – IceGlow 2016-07-25 15:37:23
檢查Wine的配置以查看它如何訪問音頻。 http://askubuntu.com/questions/77210/how-to-change-the-default-audio-in-wine-to-alsa-only – IceGlow 2016-07-25 15:39:21