WikiトップAugust Framework 2.0>AF2_tutorial11

August Framework 2.0 : チュートリアル 11 ~ BGMを再生してみる

(本項で説明する機能は ver 0.7.9 以降でのみ使えます。)

CAugustSound2 では .wavファイルしか再生できませんでした。

今回、CAugustMusic2 クラスを用いて、.wavファイル以外の各種オーディオメディアを再生してみます。

  1. #include "mglaugust2.h"
  2. #include <string>
  3. // メインフレームクラス
  4. class CMyFrame : public CAugustWindowFrame2
  5. {
  6. private:
  7. CAugustMusic2 m_music;
  8. CAugustKeyboardInput2 m_kb;
  9. CAugustText2 m_text;
  10. bool m_bMediaLoaded; // メディアが読み込み済ならtrueにする
  11. // メディアファイル選択ダイアログ
  12. std::string SelectMedia()
  13. {
  14. OPENFILENAME ofn;
  15. char szOutFilePath[1024];
  16. ZeroMemory( &ofn, sizeof(ofn) );
  17. ZeroMemory( szOutFilePath, sizeof(szOutFilePath) );
  18. ofn.lStructSize = sizeof(OPENFILENAME);
  19. ofn.hwndOwner = (HWND)this->GetHwnd();
  20. ofn.lpstrFile = szOutFilePath;
  21. ofn.nMaxFile = sizeof(szOutFilePath);
  22. ofn.lpstrFilter = "再生可能なメディア(mp3,wma,ogg,mid,wav)\0*.mp3;*.wma;*.ogg;*.mid;*.wav\0";
  23. ofn.lpstrTitle = "ファイルを開く";
  24. ofn.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY | OFN_NOCHANGEDIR;
  25. // 実行
  26. if ( ::GetOpenFileName(&ofn) )
  27. return szOutFilePath;
  28. else
  29. return "";
  30. }
  31. public:
  32. // 初期化時に呼ばれる
  33. bool OnGraphicInitEnded()
  34. {
  35. // メディアが読みこまれていないのでfalseを設定
  36. m_bMediaLoaded = false;
  37. // コントロールクラスの登録
  38. RegistControl(&m_kb);
  39. RegistControl(&m_music);
  40. RegistControl(&m_text);
  41. // キーボードハンドラの登録
  42. m_kb.RegistHandler(
  43. CAugustKeyboardInput::EVTTYPE_ON_DOWN,
  44. 'O',
  45. (CAugustKeyboardInput::CALLBACK_TYPE_MI)&CMyFrame::Open,
  46. this);
  47. m_kb.RegistHandler(
  48. CAugustKeyboardInput::EVTTYPE_ON_DOWN,
  49. 'Z',
  50. (CAugustKeyboardInput::CALLBACK_TYPE_MI)&CMyFrame::Play,
  51. this);
  52. m_kb.RegistHandler(
  53. CAugustKeyboardInput::EVTTYPE_ON_DOWN,
  54. 'X',
  55. (CAugustKeyboardInput::CALLBACK_TYPE_MI)&CMyFrame::Stop,
  56. this);
  57. m_kb.RegistHandler(
  58. CAugustKeyboardInput::EVTTYPE_ON_DOWN,
  59. 'C',
  60. (CAugustKeyboardInput::CALLBACK_TYPE_MI)&CMyFrame::Pause,
  61. this);
  62. m_text.SetText(
  63. "O: ファイルを開く\n"
  64. "Z: 再生\n"
  65. "X: 停止\n"
  66. "C: ポーズ\n");
  67. SetWindowTitle("簡易メディアプレイヤー");
  68. return true;
  69. }
  70. // ファイルを開く
  71. bool Open(){
  72. std::string strMedia = SelectMedia();
  73. if ( strMedia.length() != 0 )
  74. {
  75. m_music.Load(strMedia.c_str());
  76. m_bMediaLoaded = true;
  77. Play();
  78. }
  79. return true;
  80. }
  81. // 再生
  82. bool Play(){
  83. if ( !m_bMediaLoaded )
  84. Open();
  85. else
  86. m_music.Play();
  87. return true;
  88. }
  89. // 停止
  90. bool Stop(){
  91. if ( m_bMediaLoaded )
  92. m_music.Stop();
  93. return true;
  94. }
  95. // ポーズ
  96. bool Pause(){
  97. if ( m_bMediaLoaded )
  98. m_music.Pause();
  99. return true;
  100. }
  101. };
  102. // WinMain
  103. int APIENTRY WinMain(HINSTANCE hInstance,
  104. HINSTANCE hPrevInstance,
  105. LPSTR lpCmdLine,
  106. int nCmdShow )
  107. {
  108. CMyFrame frame;
  109. frame.Start();
  110. return 0;
  111. }

ちょっとしたメディアプレイヤーっぽく仕上げてみました。再生、停止、ポーズが出来ます。
(ファイル選択ダイアログのために、SelectMedia() メソッド内部で ::GetOpenFileName() と言うWindows APIを呼び出していますが、ここでは詳しくは説明しません。悪しからず)

ちなみにサポートしているメディア形式は、mp3,wma,ogg,mid,wavのいづれかです。

なお、.oggファイルを再生する場合には、Open-MGL配布パッケージ内 bin\Release の Vox.dll が
実行モジュールと同じディレクトリに配置されている必要があります(ちなみにReleaseビルド、Debugビルドに関係なく bin\Release の Vox.dll です)。
また、wmaファイルの再生には、Windows Media Player 7 以降がインストールされている必要があります。
(確かWindows XPではデフォルトで入っていたような気がしますが・・・Windows 2000等の古いOSでは、初期状態ではインストールされていなかったと思います。)