- PR -

C#でMCIを使い録音

1
投稿者投稿内容
未記入
大ベテラン
会議室デビュー日: 2005/08/25
投稿数: 145
投稿日時: 2008-05-05 03:21
C#でマイクの音を録音しようと思い自分なりに勉強して
http://wisdom.sakura.ne.jp/system/winapi/media/mm8.html
このページを参考に書いてみました。

[DllImport("winmm.dll")]//http://msdn.microsoft.com/ja-jp/library/cc410493.aspx
private extern static uint mciSendCommand(
uint IDDevice, // デバイス識別子
uint uMsg, // コマンドメッセージ
uint fdwCommand, // フラグ
uint dwParam // パラメータを保持している構造体
);

[StructLayout(LayoutKind.Sequential)]
public struct MCI_RECORD_PARMS
{
public uint dwCallback;
public uint dwFrom;
public uint dwTo;
}
private MCI_RECORD_PARMS mrp;


[StructLayout(LayoutKind.Sequential)]//http://wisdom.sakura.ne.jp/system/winapi/media/mm3.html
public struct MCI_OPEN_PARMS
{
public uint dwCallback;
public uint wDeviceID;
public string lpstrDeviceType;
public string lpstrElementName;
public string lpstrAlias;
}
private MCI_OPEN_PARMS mop;

まず、定義というのか書き方はこれで大丈夫なのか不安です。

また、mciSendCommand(mop.wDeviceID , MCI_RECORD , 0 , 0);
で録音なのですが、まず、第一引数のmop.wDeviceIDにどうやって
マイクのデバイス(?)を格納するのかということ。
2つ目に第二引数はMCI_RECORDとなっているのですが
'MCI_RECORD' は現在のコンテキスト内に存在しません。
となってしまいます。
このAPIを扱っている方はかなり少ないと勝手に予測しておりますが
ご存知の方いらっしゃいましたら教えて頂ければありがたいです。
くまっち
大ベテラン
会議室デビュー日: 2008/01/18
投稿数: 169
お住まい・勤務地: 茨城県のどこか。
投稿日時: 2008-05-13 10:54
亀レスですが、参考までに。

構造体定義等については、それで合っていると思われます。
(詳しくは「C# Win32API 構造体」等でググってください。)

> mop.wDeviceIDにどうやってマイクのデバイス(?)を格納するのか
回答:ご自身で格納はしません。mciSendCommand関数を呼び出す事で
関数側がデバイスIDを設定します。(MCI_OPEN時)

> MCI_RECORDとはなんぞや。
回答:C++ではMMsystem.hにて定義されている定数です。
定義内容は「#define MCI_RECORD 0x080F」です。
つまり、0x080Fの事。C#ではご自身で定義するなり、直接0x080Fを渡すなりしてください。

> このAPIを扱っている方はかなり少ないと勝手に予測
DirectX(DirectSound)を使う方が一般的かも?
未記入
大ベテラン
会議室デビュー日: 2005/08/25
投稿数: 145
投稿日時: 2008-05-13 19:23
くまっちさんとてもわかりやすい解答ありがとうございます。
よく、内容が飲み込めました。

ちょっと横道にそれますが
「MCI_RECORD 0x080F」で検索(日本語のページのみ)すると
このページだけしかひっかかりませんでした。

どうやって「0x080F」という情報をえられたのでしょうか?
くまっち
大ベテラン
会議室デビュー日: 2008/01/18
投稿数: 169
お住まい・勤務地: 茨城県のどこか。
投稿日時: 2008-05-13 20:47
C++においてWin32APIを使用するためには、windows.hのインクルードが必要です。
windows.hは各種ヘッダーをインクルードしています。
この各種ヘッダーの中に、MCI関連の定義ファイルとして
MMsystem.hが存在します。

これらのファイルはSDKに含まれていますのでVSがインストールされているフォルダ内を
検索してみてください。
VS2005のデフォルトインストール先では
コード:
C:\\Program Files\\icrosoft Visual Studio 8\\VC\\PlatformSDK\\Includeです。



このMMsystem.hの中に前述したとおり
#define MCI_RECORD 0x080Fと記述されている行がございます。

この辺はVC++の知識がないと、なかなかたどり着けないかもしれませんね。
未記入
大ベテラン
会議室デビュー日: 2005/08/25
投稿数: 145
投稿日時: 2008-05-13 21:01
なんと、答えは既に僕のパソコンの中にあったのですか。
灯台下暗し。

と思い、のぞいてみたら、肝心のフォルダがなかったのです。
おそらく、無料のExpress Editionだからだとは思うのですが。

ただ、検索したら山のようにファイルがあるのでそれをダウンロードしてみます。
ありがとうございます。
1

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