- PR -

DirectSoundによるサウンドキャプチャ

1
投稿者投稿内容
mit
会議室デビュー日: 2005/06/19
投稿数: 6
投稿日時: 2006-02-10 08:29
はじめまして。
Managed DirectXとC#で、サウンドのキャプチャをやろうとしているのですが、
MDXのチュートリアル通りに進めているつもりなのですが上手くいきません。
対象としている入力はPCのマイク入力です。
まだこのコードはアプリケーションに組み込むレベルではなく、
ちょっとしたテストのつもりで書いています。

どなたか同様の開発経験をお持ちのかた、
またはどこかに良いサンプルコードがあるとご存知の方、
教えていただけますでしょうか。

public Form1()
{
//
// Windows フォーム デザイナ サポートに必要です。
//
InitializeComponent();
try
{
//
// TODO: InitializeComponent 呼び出しの後に、コンストラクタ コードを追加してください。
//
Microsoft.DirectX.DirectSound.CaptureDevicesCollection captureDevicesCollection = new CaptureDevicesCollection();
Microsoft.DirectX.DirectSound.Capture capture = new Capture(captureDevicesCollection[1].DriverGuid);
Microsoft.DirectX.DirectSound.CaptureBufferDescription captureBufferDesc = new CaptureBufferDescription();
Microsoft.DirectX.DirectSound.CaptureBuffer captureBuffer = new CaptureBuffer(captureBufferDesc,capture);

}
catch(Exception E)
{
MessageBox.Show(E.ToString());
}
}

captureBufferのコンストラクタを呼び出すところで、「値が有効ではありません。」とだけ書かれた例外が返されてしまいます。
CaptureBufferDescriptionのFormatに何か入れないといけないのかも知れないですが、
その各種パラメータの指定の仕方が分かりません。
ハードウェアに依存してしまうものなのでしょうか。

実行環境:Windows XP SP2
開発環境:icrosoft Visual Studio.NET2003 + Managed DirectX 9.0
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-02-10 09:25
引用:

mitさんの書き込み (2006-02-10 08:29) より:

captureBufferのコンストラクタを呼び出すところで、「値が有効ではありません。」とだけ書かれた例外が返されてしまいます。


コンストラクタで、InvalidCallException が発生するんですね。

引用:

CaptureBufferDescriptionのFormatに何か入れないといけないのかも知れないですが、
その各種パラメータの指定の仕方が分かりません。


コード:

    wavFormat = new WaveFormat();
    wavFormat.SamplesPerSecond = 9600;
    wavFormat.BitsPerSample = 8;
    wavFormat.Channels = 1;
          :
          :
    CaptureBufferDescription capBufferDescription = new CaptureBufferDescription();
    capBufferDescription.BufferBytes = 1024;
    capBufferDescription.Format = wavFormat;


こんな感じかな。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
mit
会議室デビュー日: 2005/06/19
投稿数: 6
投稿日時: 2006-02-10 10:13
> じゃんぬねっと さん
返答いただいて、ほんとにありがとうございます。

残念ながら、教えていただいたとおりwaveformatを指定しても、
まだ上手くいきませんでした。
返される例外はSystem.ArgumentExceptionですが、
これはもしやCaptureインスタンスの方に問題があるのでしょうか?

最初に列挙されるCaptureDevicesCollectionは2つで、それぞれDescriptionを見ると
(1)プライマリサウンドキャプチャドライバ
(2)SoundMAX Digital Audio
となっています。それぞれのDriverGuidが
(1)00000000-0000-0000-0000-000000000000
(2)bd6dd71b-3deb-11d1-b171-00c04fc20000
です。どちらを用いてcaptureインスタンスを作っても同じエラーです。

captureを生成したあとそのcapsを見ると、
---------------------------------
Channels: 2
Format96KhzStereo16Bit: False
Format96KhzStereo8Bit: False
Format96KhzMono16Bit: False
Format96KhzMono8Bit: False
Format48KhzStereo16Bit: False
Format48KhzStereo8Bit: False
Format48KhzMono16Bit: False
Format48KhzMono8Bit: False
Format44KhzStereo16Bit: True
Format44KhzStereo8Bit: False
Format44KhzMono16Bit: True
Format44KhzMono8Bit: False
Format22KhzStereo16Bit: True
Format22KhzStereo8Bit: False
Format22KhzMono16Bit: True
Format22KhzMono8Bit: False
Format11KhzStereo16Bit: True
Format11KhzStereo8Bit: False
Format11KhzMono16Bit: True
Format11KhzMono8Bit: False
MultipleCapture: True
Certified: True
EmulatedDriver: False
------------------------------
となっています。この中からtrueになっているものでwaveformatの各値を指定してみたのですが、まだ上手くいかないです…とほほ。

# .NETからWindowsプログラムを始めたので、やっぱり
# ManagedとはいってもDirectXを使うのはとても苦労しますね。
# 通常の.NET Frameworkのクラス群がどれだけフレンドリーに作られているか
# 実感します。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-02-10 10:24
引用:

mitさんの書き込み (2006-02-10 10:13) より:

返される例外はSystem.ArgumentExceptionですが、
これはもしやCaptureインスタンスの方に問題があるのでしょうか?


そっちであれば、引数のインスタンスの状態に問題があるということになるでしょう。

とりあえず、このあたりを任意の値に設定してください。
WaveFormat.SamplesPerSecond
WaveFormat.BlockAlign
WaveFormat.FormatTag

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
1

スキルアップ/キャリアアップ(JOB@IT)