Media Foundation SampleにあるCPlayerクラスをMSMで書き換えてみることにする。
まずは状態クラスの定義をしてみる。CPlayerクラスには状態管理のためのenum定義がある。これをそのまま状態クラス定義に置き換えればよいだけだ。
namespace sf {
namespace player {
namespace msmf = boost::msm::front;
// const UINT WM_APP_PLAYER_EVENT = WM_APP + 1;
// WPARAM = IMFMediaEvent*, WPARAM = MediaEventType
//enum PlayerState
//{
// Closed = 0, // No session.
// Ready, // Session was created, ready to open a file.
// OpenPending, // Session is opening a file.
// Started, // Session is playing a file.
// Paused, // Session is paused.
// Stopped, // Session is stopped (ready to play).
// Closing // Application has closed the session, but is waiting for MESessionClosed.
//};
// 状態クラス定義
struct Closed : msmf::state<> {}; // セッションなし
struct Ready : msmf::state<> {}; // セッションが作成され、ファイルを開く準備ができている。
struct OpenPending :msmf::state<> {};// セッションはファイルをオープンしている
struct Started : msmf::state<> {};// セッションは演奏している。
struct Paused : msmf::state<> {};// セッションは一時停止している。
struct Stopped : msmf::state<> {};// セッションは停止している(演奏可能状態である)。
struct Closing : msmf::state<> {};// アプリケーションはセッションを閉じたが、MESessionClosed状態を待っている。
まあこんな感じで状態クラスを定義してくわけだ。状態クラスはいろいろできることがあるが、これが最小の定義だろう。このようにMSMでは状態は型(クラス定義)で持つのである。