DirectShowを使ったWindows Mobileアプリケーションの構築例
syu5 [著] 2007/11/19 14:00

ソースコード 21.86 KB
1 2 3 →
完成図
完成図

はじめに

 「DirectShow」は動画や音声などの再生・キャプチャに使われているWindowsのテクノロジーですが、Windows Mobileにも実装されています。本稿ではDirectShowを使って、Advanced/W-ZERO3 [es]上で動作する簡易音声レコーダアプリを作成します。

対象読者

 以下のアプリケーションを開発したことがある人。

  1. C++言語を使ったアプリケーション
  2. Windows Mobile用アプリケーション
  3. COMを使ったアプリケーション

作成/実行環境

 Visual Studio 2005はStandard Edition以上が必須です。リモートデバッグ機能を使うためにProfessional Edition以上を推奨します。Express Editionではプロジェクトファイルの作成および読み込みができません。

動作環境について
 本稿はAdvanced/W-ZERO3 [es]で動作確認を行っています。それ以外のWindows Mobile端末では正しく動作しないことがあります。

ユーザーインターフェイスの作成

 早速、Visual Studio 2005を使って実装していきます。ここではプロジェクト名を「VRecorder」として新規作成しました。

 録音の開始・停止するためのボタンコントロールをCreateWindowを使って画面上に設置します。

resourceppc.h
// (追加する)
#define IDC_RECBUTTON 10001
VRecorder.cpp
// (グローバル変数として宣言)
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関数を呼び出すことにします。

VRecorder.cpp
// (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」に次のコードを追加します。

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を呼び出す必要があります。

VRecorder.cpp
int WINAPI WinMain(HINSTANCE hInstance,
                   HINSTANCE hPrevInstance,
                   LPTSTR    lpCmdLine,
                   int       nCmdShow)
{
    MSG msg;
    // COM の使用を開始
    CoInitializeEx(NULL, COINIT_MULTITHREADED);

    // (...中略...)

    // COM を解放
    CoUninitialize();
    return (int) msg.wParam;
}

1 2 3
→
INDEX
Advanced/W-ZERO3 [es]で簡易音声レコーダを作ろう
Page1
はじめに
対象読者
作成/実行環境
ユーザーインターフェイスの作成
DirectShowを使うための準備
録音機能の実装(1/2)
録音機能の実装(2/2)
実行結果
おわりに
参考文献
プロフィール
syu5

Microsoft MVP for DirectShow/Media Foundation 2007 Oct - 2010 Sept.

ブログ : ImageryBlog

Twitter : http://twitter.com/syu5


注目の求人情報
プログラマ/ベンチャーSIer
ITプロジェクトにおける開発(プログラミング)作業 Java、C#、.NET等を使用しての開発業務 ...
コンサルタント/外資系コンサルティングファーム
ITコンサルティング (設計・開発・導入、そして業務およびシステムの運用までのコンサルティング)...
プロジェクトマネージャー/ITソリューション
(1)UML、オブジェクト指向開発技術を用いたアプリケーション開発のプロジェクトマネジャー/リーダー ...

(最新日付順)
名前(ゲストの方もコメントをどうぞ):*
アイコン:
なし

内容(テキストのみ1200文字まで):*

投稿規定に同意して

スポンサーサイト

この記事のトラックバックURL: