Managed DirectSoundを使ってマイクから音声を録音してみる1

このエントリーをはてなブックマークに追加

chakemiです。
今日は、DirectSoundを使ってマイクから音声を録音に挑戦してみましたが、オーディオのキャプチャがうまくできませんでした。。。(T T)

開発環境:
WindowsXP SP3
VisualC#2010Express
 
DirectSoundを使ってマイクからの入力を録音するには、基本的には、waveファイルを再生と逆をやればいいはずと踏んでます。

ざっくりと流れだけ纏まると、

まずは、WaveFormatを生成する。

waveFormat = new WaveFormat();
waveFormat.Channels = 1;
waveFormat.FormatTag = WaveFormatTag.Pcm;
waveFormat.BitsPerSample = 16;
waveFormat.SamplesPerSecond = 44100;
waveFormat.BlockAlign = (short)(waveFormat.Channels * (waveFormat.BitsPerSample / (short)8));
waveFormat.AverageBytesPerSecond = waveFormat.BlockAlign * waveFormat.SamplesPerSecond;

 
次に、Device情報から、Captureオブジェクトの作成。

device = new Device();
device.SetCooperativeLevel(this, CooperativeLevel.Priority);
captureDevice = new CaptureDevicesCollection();
DeviceInformation deviceInfo = captureDevice[1];
capture = new Capture(deviceInfo.DriverGuid);

 
captureBufferDescription構造体に必要な情報を入力する。

captureBufferDescription = new CaptureBufferDescription();
captureBufferDescription.BufferBytes = waveFormat.AverageBytesPerSecond / 5;
captureBufferDescription.WaveMapped = false;
captureBufferDescription.ControlEffects = false;
captureBufferDescription.Format = waveFormat;

 
RIFF形式のヘッダ情報を書き込んで、

BinaryWriter binaryWriter = new BinaryWriter(new FileStream(@"C:\test_ds_rec.wav", FileMode.Create));

char[] Riff = { 'R', 'I', 'F', 'F' };
char[] Wave = { 'W', 'A', 'V', 'E' };
char[] Fmt = { 'f', 'm', 't', ' ' };
char[] Data = { 'd', 'a', 't', 'a' };
short padding = 1;
int formatLength = 0x10;
int length = 0;
short shBytePerSample = 2;

binaryWriter.Write(Riff);
binaryWriter.Write(length);
binaryWriter.Write(Wave);
binaryWriter.Write(Fmt);
binaryWriter.Write(formatLength);
binaryWriter.Write(padding);
binaryWriter.Write(waveFormat.Channels);
binaryWriter.Write(waveFormat.SamplesPerSecond);
binaryWriter.Write(waveFormat.AverageBytesPerSecond);
binaryWriter.Write(shBytePerSample);
binaryWriter.Write(waveFormat.BitsPerSample);
binaryWriter.Write(Data);
binaryWriter.Write((int)0);

 
別スレッドを立ち上げて、CaptureBuffer.Readでストリームバッファを
書き込み続ければいけるんじゃないかって感じで、今この辺です。。。

グダグダですみません。
 
次回までに、完成させたいと思います。

return top