ubuntu 12.04のミキサーからサウンドをキャプチャするテスト目的の小さなJavaアプリケーションを作成しました。
コードは正常に動作し、Wine で実行されているものを除くすべてのアプリケーションからサウンドをキャプチャできます。
Wineを起動した後、プログラムを起動するたびに、への呼び出しtargetDataLine.read()
が永久にブロックされます
Wine がバックグラウンドで実行されていない0
場合、期待どおり、入力がない場合、または入力がある場合は読み込まれたバイト数が正しく出力されます。
Wine を起動する前にプログラムを起動すると、Wine 内でサウンド ドライバーを使用できなくなります。
Alsa が提供するミキサーとデフォルトのデバイスの両方を使用してみましたが、結果は同じでした。
Wineが何らかの理由で Alsa をロックすることは想像できますTargetDataLine.read()
が、Wine で音を鳴らすための単純な呼び出しが失敗するのはなぜでしょうか?
mixerInfo[0]
ところで、私のシステムではデフォルトであり、アプリケーションはもちろん、オラクルの最新の 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);
}
}