見出し画像

64. 音データを収集する他の方法

前回の記事                        次回の記事

はじめに

前回まで2回に渡り、Windows Media Foundation を使った音データ収集方法を試してきました。
実は、他にもマイクロフォンデバイスからの音データ収集に使える API があるので、今回は、それを実際に使ってみることにします。
Native Code ‐ Managed Code の Interop についても解説しています。

WinMM システムコンポーネント

ユーザー モード WDM オーディオ コンポーネント - Windows drivers | Microsoft Learn
このページで紹介されている WinMM システムコンポーネントが提供する WinMM API の利用が可能です。

WinMM システム コンポーネント (Winmm.dllおよびその 16 ビット対応の Mmsystem.dll) は、Microsoft Windows マルチメディア API waveXxx、midiXxx、mixerXxx、auxXxx を実装します (Microsoft Windows SDKドキュメントを参照)。 WinMM コンポーネントは WDMAud システム ドライバーを使用して、WinMM API 呼び出しをカーネル ストリーミング I/O 要求に変換します。

https://learn.microsoft.com/ja-jp/windows-hardware/drivers/audio/user-mode-wdm-audio-components#winmm-system-component

Windows Vista 以降の Device Driver モデルも非常に興味深いのですが、そのネタの詳細は別の場所で行うとして、WinMM コンポーネントはオーディオ系のデバイスドライバー(WDMAud System Driver)を使ってオーディオ系の機能を使うためのコンポーネントのようで、Wav 系は、Microsoft Windows Multimedia API waveXXX API を使うのだそうです。

Windows Multimedia Wave 系 API

詳細は、Mmeapi.h ヘッダー - Win32 apps | Microsoft Learn に記載されています。waveXXX api を使って、前回の記事で実現した、マイクロフォンデバイスからの音データをファイル化する処理の実現を目指します。

アンマネージドコードとの相互運用機能を使う

前回までの記事では、Visual C++ を使ったプログラミングを行っていました。
.NET Framework は、COM コンポーネント等の Native 実装されたライブラリの API を、アンマネージ コードとの相互運用 - .NET Framework | Microsoft Learn という仕組みを使って、C# や Visual Basic で記述されたコード(Managed Code)から使用する事が出来ます。GUI を作ったりするのは、何と言っても、WPF が使える .NET Framework の方が超便利なので、今回は、この機能を使って、waveXXX API を Wrap して使う事にします。

この記事を書くにあたっては、
C# マイク入力・WAVEファイル保存 Win32API - Qiita
というブログを参考にしています。コードのかなりの部分(特にWaveNativeAPI.csと MicSoundRecorder.cs)は、このブログで紹介されているものをそのまま使っています。再利用したい場合は、https://note.com/kae_made のラインセンスポリシーの他に、C# マイク入力・WAVEファイル保存 Win32API - Qiita のライセンスポリシーも考慮に入れてください。

注意

waveXXX API の内で、必要になる関数は、C# マイク入力・WAVEファイル保存 Win32API - Qiita を見ると一目瞭然なので、そちらを参考にしてもらう事にして、ここではアンマネージドコードの相互運用を使う方法をちょっとだけ詳しく解説しておくことにします。

ここから先は

20,446字 / 2画像

2022年3月にマイクロソフトの中の人から外の人になった Embedded D. George が、現時点で持っている知識に加えて、頻繁に…

この記事が気に入ったらチップで応援してみませんか?