スピーカーから音量レベルを読み取りたい。ただし、スピーカーに送信されているデータを取得する方法がわかりません。このメソッドを使用し、TargetDataLine からデータを読み取ることで、マイクに対してこれを行うことができました。ただし、スピーカーに対してこれを行う方法がわかりません。スピーカーに送信されているデータを読み取りたい (おそらく SourceDataLine 経由?) SourceDataLine を使用して振幅を取得しようとしましたが、サンプル コードが機能せず、-1 を返し続けます。助言がありますか?コード例:
public static void main(String[] args) {
// TODO Auto-generated method stub
JFrame frame = new JFrame();
JProgressBar bar = new JProgressBar();
frame.getContentPane().add(bar);
frame.pack();
//frame.show();
AudioFormat audio = new AudioFormat(8000.0F,16,1,true,false);
//DataLine.Info info = new DataLine.Info(SourceDataLine.class, audio);
DataLine.Info speakerInfo = new DataLine.Info(SourceDataLine.class, audio);
SourceDataLine speaker;
try {
speaker = (SourceDataLine) AudioSystem.getLine(speakerInfo);
speaker.open(audio);
speaker.start();
//Toolkit.getDefaultToolkit().beep();
} catch (LineUnavailableException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return;
}
//while(true){
System.out.println(speaker.getLevel());
//}
}
public static int calculateRMSLevel(byte[] audioData){
long lSum = 0;
for(int i=0; i<audioData.length; i++)
lSum = lSum + audioData[i];
double dAvg = lSum / audioData.length;
double sumMeanSquare = 0d;
for(int j=0; j<audioData.length; j++)
sumMeanSquare = sumMeanSquare + Math.pow(audioData[j] - dAvg, 2d);
double averageMeanSquare = sumMeanSquare / audioData.length;
return (int)(Math.pow(averageMeanSquare,0.5d) + 0.5);
}