2006-02-21
■[JVM]javax.sound.sampledの作成
「javax.sound.sampledを作って」という要望が多かったので、がんばって作ってみることにした。
- Windows CE上の音声入力/出力処理方法を勉強する
- javax.sound.sampledを勉強する
- この2つをどのようにつなぎ合わせるかを考える
という作業が必要だ。いろいろ試行錯誤した結果、以下のような簡単なプログラムがMysaifu JVM上で動作するようになった。このプログラムを実行すると、10秒間録音した後、すぐに録音した結果を再生する。
import javax.sound.sampled.*;
public class SoundTest {
public static void main(String[] args) throws Exception {
final float sampleRate = 8000f;
final int sampleSizeInBits = 8;
final int channels = 1;
AudioFormat format
= new AudioFormat(sampleRate,
sampleSizeInBits,
channels,
false,
false);
final int seconds = 10;
System.out.println("Start recording " + seconds + " seconds");
byte[] wavedata = record(format, seconds);
System.out.println("Done");
System.out.println("Start playing");
play(format, wavedata);
System.out.println("Done");
System.exit(0);
}
static byte[] record(AudioFormat format, int seconds)
throws LineUnavailableException {
DataLine.Info info
= new DataLine.Info(TargetDataLine.class, format);
TargetDataLine line = (TargetDataLine) AudioSystem.getLine(info);
int sampleRate = (int) format.getSampleRate();
int channels = format.getChannels();
int sampleSizeInBits = format.getSampleSizeInBits();
final int bytesPerSec
= (int) (sampleRate * channels * sampleSizeInBits / 8);
byte[] buff = new byte[bytesPerSec * seconds];
line.open(format);
line.start();
line.read(buff, 0, buff.length);
line.drain();
line.close();
return buff;
}
static void play(AudioFormat format, byte[] wavedata)
throws LineUnavailableException {
DataLine.Info info
= new DataLine.Info(SourceDataLine.class, format);
SourceDataLine line = (SourceDataLine) AudioSystem.getLine(info);
line.open(format);
line.start();
line.write(wavedata, 0, wavedata.length);
line.drain();
line.close();
}
}
音が出るプログラムを書くのは結構面白いことがわかった。できればClip実装クラスも作って、MP3ファイルも再生できるようにしたい。
トラックバック - http://d.hatena.ne.jp/freebeans/20060221/p1


