「音声ファイル再生(.wav,.mid等)」の編集履歴(バックアップ)一覧はこちら
追加された行は緑色になります。
削除された行は赤色になります。
<p> <strong>DirectShowを使って音声ファイルを再生してみます。<br />
DirectShowはフィルタ(コーデック)をインストールするとかなりの<br />
ファイル形式を再生する事ができます。<br />
.ogg もフィルタをインストールしたら再生できました。</strong></p>
<p> <img alt="" src="http://www21.atwiki.jp/opengl?cmd=upload&act=open&pageid=37&file=dshow1.png" /></p>
<table border="1" cellspacing="1" cellpadding="1" width="600"><tbody><tr><td>
<p><font size="2">#pragma comment (lib, "strmiids.lib")</font></p>
<p><font size="2">#include <windows.h><br />
#include <dshow.h></font></p>
<p><font size="2">#define FileName TEXT("test.mid")</font></p>
<p><font size="2">IGraphBuilder *pGB;<br />
IMediaControl *pMC;</font></p>
<p><font size="2">void Init()<br />
{<br />
//COMを初期化<br />
CoInitialize(NULL);<br />
//FilterGraphを生成<br />
CoCreateInstance(CLSID_FilterGraph,NULL,CLSCTX_INPROC,<br />
IID_IGraphBuilder,(LPVOID *)&pGB);</font></p>
<p><font size="2"> //MediaControlインターフェース取得<br />
pGB->QueryInterface(IID_IMediaControl,<br />
(LPVOID *)&pMC);</font></p>
<p><font size="2"> //Graphを生成<br />
pMC->RenderFile(FileName);</font></p>
<p><font size="2"> //再生開始<br />
pMC->Run();<br />
}<br />
//コールバック<br />
LRESULT CALLBACK WndProc(HWND hwnd , UINT msg , WPARAM wp , LPARAM lp)<br />
{<br />
switch (msg) {<br />
//終了処理<br />
case WM_DESTROY:<br />
//資源を解放<br />
pMC->Release();<br />
pGB->Release();</font></p>
<p><font size="2"> //COM終了<br />
CoUninitialize();<br />
PostQuitMessage(0);<br />
return 0;<br />
}</font></p>
<p><font size="2"> return DefWindowProc(hwnd , msg , wp , lp);<br />
}<br />
//メイン<br />
int WINAPI WinMain(HINSTANCE hInst , HINSTANCE hPrevI , PSTR lpCmd , int
nCmdShow)<br />
{<br />
HWND hwnd;<br />
MSG msg;<br />
WNDCLASS winc;</font></p>
<p><font size="2"> winc.style = CS_HREDRAW | CS_VREDRAW;<br />
winc.lpfnWndProc = WndProc;<br />
winc.cbClsExtra = winc.cbWndExtra = 0;<br />
winc.hInstance = hInst;<br />
winc.hIcon = LoadIcon(NULL , IDI_APPLICATION);<br />
winc.hCursor = LoadCursor(NULL , IDC_ARROW);<br />
winc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);<br />
winc.lpszMenuName = NULL;<br />
winc.lpszClassName = TEXT("window");</font></p>
<p><font size="2"> if (!RegisterClass(&winc)) return 0;</font></p>
<p><font size="2"> hwnd = CreateWindow(TEXT("window") , TEXT("Hellow DirectShow
World!!") ,<br />
WS_OVERLAPPEDWINDOW | WS_VISIBLE ,<br />
100 , 100 , 320 , 240 , NULL , NULL ,hInst , NULL);</font></p>
<p><font size="2"> if (hwnd == NULL) return 0;</font></p>
<p><font size="2"> Init();</font></p>
<p><font size="2"> while (GetMessage(&msg , NULL , 0 , 0))
DispatchMessage(&msg);<br />
return msg.wParam;<br />
}</font></p>
</td>
</tr></tbody></table><p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p><strong>DirectShowを使って音声ファイルを再生してみます。<br />
DirectShowはフィルタ(コーデック)をインストールするとかなりの<br />
ファイル形式を再生する事ができます。<br />
.ogg もフィルタをインストールしたら再生できました。</strong></p>
<p> <img alt="" src="http://www21.atwiki.jp/opengl?cmd=upload&act=open&pageid=37&file=dshow1.png" /></p>
<table border="1" cellspacing="1" cellpadding="1" width="600"><tbody><tr><td>
<p><font size="2">#pragma comment (lib, "strmiids.lib")</font></p>
<p><font size="2">#include <windows.h><br />
#include <dshow.h></font></p>
<p><font size="2">#define FileName TEXT("test.mid")</font></p>
<p><font size="2">IGraphBuilder *pGB;<br />
IMediaControl *pMC;</font></p>
<p><font size="2">void Init()<br />
{<br />
//COMを初期化<br />
CoInitialize(NULL);<br />
//FilterGraphを生成<br />
CoCreateInstance(CLSID_FilterGraph,NULL,CLSCTX_INPROC,<br />
IID_IGraphBuilder,(LPVOID *)&pGB);</font></p>
<p><font size="2"> //MediaControlインターフェース取得<br />
pGB->QueryInterface(IID_IMediaControl,<br />
(LPVOID *)&pMC);</font></p>
<p><font size="2"> //Graphを生成<br />
pMC->RenderFile(FileName);</font></p>
<p><font size="2"> //再生開始<br />
pMC->Run();<br />
}<br />
//コールバック<br />
LRESULT CALLBACK WndProc(HWND hwnd , UINT msg , WPARAM wp , LPARAM lp)<br />
{<br />
switch (msg) {<br />
//終了処理<br />
case WM_DESTROY:<br />
//資源を解放<br />
pMC->Release();<br />
pGB->Release();</font></p>
<p><font size="2"> //COM終了<br />
CoUninitialize();<br />
PostQuitMessage(0);<br />
return 0;<br />
}</font></p>
<p><font size="2"> return DefWindowProc(hwnd , msg , wp , lp);<br />
}<br />
//メイン<br />
int WINAPI WinMain(HINSTANCE hInst , HINSTANCE hPrevI , PSTR lpCmd , int
nCmdShow)<br />
{<br />
HWND hwnd;<br />
MSG msg;<br />
WNDCLASS winc;</font></p>
<p><font size="2"> winc.style = CS_HREDRAW | CS_VREDRAW;<br />
winc.lpfnWndProc = WndProc;<br />
winc.cbClsExtra = winc.cbWndExtra = 0;<br />
winc.hInstance = hInst;<br />
winc.hIcon = LoadIcon(NULL , IDI_APPLICATION);<br />
winc.hCursor = LoadCursor(NULL , IDC_ARROW);<br />
winc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);<br />
winc.lpszMenuName = NULL;<br />
winc.lpszClassName = TEXT("window");</font></p>
<p><font size="2"> if (!RegisterClass(&winc)) return 0;</font></p>
<p><font size="2"> hwnd = CreateWindow(TEXT("window") , TEXT("Hellow DirectShow
World!!") ,<br />
WS_OVERLAPPEDWINDOW | WS_VISIBLE ,<br />
100 , 100 , 320 , 240 , NULL , NULL ,hInst , NULL);</font></p>
<p><font size="2"> if (hwnd == NULL) return 0;</font></p>
<p><font size="2"> Init();</font></p>
<p><font size="2"> while (GetMessage(&msg , NULL , 0 , 0))
DispatchMessage(&msg);<br />
return msg.wParam;<br />
}</font></p>
</td>
</tr></tbody></table><p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>