Hatena::ブログ(Diary)

Mysaifu JVM - Windows Mobile用Java仮想マシン - 作成記 このページをアンテナに追加 RSSフィード

Windows Mobile用JVM Mysaifu JVM 公開中 English page

2006-02-21

[]javax.sound.sampledの作成

「javax.sound.sampledを作って」という要望が多かったので、がんばって作ってみることにした。

  1. Windows CE上の音声入力/出力処理方法を勉強する
  2. javax.sound.sampledを勉強する
  3. この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