はじめに
「DirectShow」は動画や音声などの再生・キャプチャに使われているWindowsのテクノロジーですが、Windows Mobileにも実装されています。本稿ではDirectShowを使って、Advanced/W-ZERO3 [es]上で動作する簡易音声レコーダアプリを作成します。
対象読者
以下のアプリケーションを開発したことがある人。
- C++言語を使ったアプリケーション
- Windows Mobile用アプリケーション
- COMを使ったアプリケーション
作成/実行環境
- Visual Studio 2005
- Windows Mobile 6 SDK
- Windows Mobile Device Emulator日本語イメージ
- Advanced/W-ZERO3 [es](WS011SH)
Visual Studio 2005はStandard Edition以上が必須です。リモートデバッグ機能を使うためにProfessional Edition以上を推奨します。Express Editionではプロジェクトファイルの作成および読み込みができません。
ユーザーインターフェイスの作成
早速、Visual Studio 2005を使って実装していきます。ここではプロジェクト名を「VRecorder」として新規作成しました。
録音の開始・停止するためのボタンコントロールをCreateWindow
を使って画面上に設置します。
// (追加する) #define IDC_RECBUTTON 10001
// (グローバル変数として宣言) HWND g_hRecButton; // (WndProc 関数内の case WM_CREATE: の後ろに追加) g_hRecButton=CreateWindow(L"BUTTON", L"REC", WS_CHILD|WS_VISIBLE, 50, 50, 200, 200, hWnd, (HMENU)IDC_RECBUTTON,g_hInst, NULL);
ボタンがタップされたときのコードを追加します。WM_COMMAND
メッセージを受けとり、LOWORD(wParam)
がIDC_RECBUTTON
の時にOnPushRecButton
関数を呼び出すことにします。
// (WndProc 関数内の case WM_COMMAND: に追加) case WM_COMMAND: wmId = LOWORD(wParam); wmEvent = HIWORD(wParam); // 選択されたメニューの解析: switch (wmId) { case IDC_RECBUTTON: OnPushRecButton(); // あとで実装する break; // (...以下略)
DirectShowを使うための準備
ライブラリの設定
DirectShowを使うために「strmiids.lib」をリンクし、「dshow.h」をインクルードします。「stdafx.h」に次のコードを追加します。
// TODO: プログラムに必要な追加ヘッダーをここで参照してください。 #pragma comment(lib, "Strmiids.lib") // DirectShow に必要 #include <dshow.h> // DirectShow に必要 #include <comutil.h> // COM を使うときに必要 // 以下のマクロはデバッグ用 #define OUT_HR(HR) {TCHAR x[512],wfn[MAX_PATH];\ MultiByteToWideChar(CP_ACP,0,__FILE__,-1,wfn,MAX_PATH);\ _snwprintf(x,512,TEXT("%s(%d) HRESULT = %X\n"),wfn,__LINE__,(HR)); OutputDebugString(x);} #define OUT_MSG(MSG) {TCHAR x[512],wfn[MAX_PATH];\ MultiByteToWideChar(CP_ACP,0,__FILE__,-1,wfn,MAX_PATH);\ _snwprintf(x,512,TEXT("%s(%d) %s\n"),wfn,__LINE__,(MSG)); OutputDebugString(x);}
COMの初期化と解放
DirectShowはCOMベースで実装されています。COMを使う前にCoInitializeEx
、使い終わったらCoUninitialize
を呼び出す必要があります。
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { MSG msg; // COM の使用を開始 CoInitializeEx(NULL, COINIT_MULTITHREADED); // (...中略...) // COM を解放 CoUninitialize(); return (int) msg.wParam; }