Boost.MSM(3) - 状態クラスの実装

公開:2013-01-10 21:01
更新:2017-09-22 05:40
カテゴリ:boost,windows,c++

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では状態は型(クラス定義)で持つのである。