CodeZine(コードジン)

特集ページ一覧

Advanced/W-ZERO3 [es]で簡易音声レコーダを作ろう

DirectShowを使ったWindows Mobileアプリケーションの構築例

  • ブックマーク
  • LINEで送る
  • このエントリーをはてなブックマークに追加
2007/11/19 14:00

ダウンロード ソースコード (21.3 KB)

Windowsのマルチメディア用APIの一つである「DirectShow」を使って、Advanced W-ZERO3 [es]上で動作する音声レコーダアプリを作成してみます。

目次
完成図
完成図

はじめに

 「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;
}

  • ブックマーク
  • LINEで送る
  • このエントリーをはてなブックマークに追加

あなたにオススメ

著者プロフィール

バックナンバー

連載:Advanced/W-ZERO3 [es]で作ろう
All contents copyright © 2005-2021 Shoeisha Co., Ltd. All rights reserved. ver.1.5