.wavを再生する(win32API)

「.wavを再生する(win32API)」の編集履歴(バックアップ)一覧はこちら

.wavを再生する(win32API)」(2015/01/01 (木) 14:11:02) の最新版変更点

追加された行は緑色になります。

削除された行は赤色になります。

<p><strong>Win32API の PlaySound を使用して .wav を再生します。<br /> glutSetOption(GLUT_ACTION_ON_WINDOW_CLOSE,GLUT_ACTION_GLUTMAINLOOP_RETURNS); を<br /> 指定すると freeglut の場合、 glutMainLoop(); から戻ってくる事が可能です。<br /> いつも解放はOSまかせにしている管理人ですが、今回は解放コードも記述しました。</strong></p> <p><strong><img alt="" src="http://cdn21.atwikiimg.com/opengl?cmd=upload&amp;act=open&amp;pageid=123&amp;file=sound.png" /></strong></p> <table border="1" cellpadding="1" cellspacing="1" style="width:100px;"><tbody><tr><td>ファイル</td> </tr><tr><td><a href="http://www21.atwiki.jp/opengl?cmd=upload&amp;act=open&amp;pageid=123&amp;file=main.cpp"> main.cpp</a></td> </tr></tbody></table><p>main.cpp</p> <table border="1" cellpadding="1" cellspacing="1" width="600"><tbody><tr><td> <p>#pragma comment(linker, "/SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup")<br /> #pragma comment(lib,"winmm.lib")<br /> #include &lt;windows.h&gt;<br /> #include &lt;mmsystem.h&gt;</p> <p>#include &lt;GL/freeglut/freeglut.h&gt;<br /> #include &lt;stdio.h&gt;</p> <p>#define WIDTH 320<br /> #define HEIGHT 240</p> <p>LPCWSTR Sound;</p> <p>class GLFONT<br /> {<br /> public:<br />  HFONT Hfont;<br />  HDC Hdc;<br />  GLFONT(wchar_t *fontname, int size);<br />  void DrawStringW(int x,int y,wchar_t *format, ...);<br /> };<br /> //コンストラクタ フォント作成<br /> GLFONT::GLFONT(wchar_t *fontname, int size)<br /> {<br />  Hfont = CreateFontW(<br />         size,      //フォント高さ<br />         0,       //文字幅<br />         0,       //テキストの角度<br />         0,       //ベースラインとx軸との角度<br />         FW_REGULAR,     //フォントの太さ<br />         FALSE,      //イタリック体<br />         FALSE,      //アンダーライン<br />         FALSE,      //打ち消し線<br />         SHIFTJIS_CHARSET,   //文字セット<br />         OUT_DEFAULT_PRECIS,   //出力精度<br />         CLIP_DEFAULT_PRECIS,  //クリッピング精度<br />         ANTIALIASED_QUALITY,  //出力品質<br />         FIXED_PITCH | FF_MODERN, //ピッチとファミリー<br />         fontname);     //書体名</p> <p> Hdc = wglGetCurrentDC();<br />  SelectObject(Hdc, Hfont);<br /> }<br /> //ワイド文字列の描画<br /> void GLFONT::DrawStringW(int x,int y,wchar_t *format, ...)<br /> {<br />  wchar_t buf[256];<br />  va_list ap;<br />  int Length=0;<br />  int list=0;<br />  <br />  //ポインタがNULLの場合は終了<br />  if ( format == NULL )<br />   return;</p> <p> //文字列変換<br />  va_start(ap, format);<br />  vswprintf_s(buf, format, ap);<br />  va_end(ap);</p> <p> Length = wcslen(buf);<br />  list = glGenLists(Length);<br />  for( int i=0; i&lt;Length; i++ ){<br />   wglUseFontBitmapsW(Hdc, buf[i], 1, list + (DWORD)i);<br />  }</p> <p> glDisable(GL_LIGHTING);<br />  glRasterPos2i(x, y);<br />  //ディスプレイリストで描画<br />  for( int i=0; i&lt;Length; i++ )<br />  {<br />   glCallList(list + i);<br />  }<br />  glEnable(GL_LIGHTING);<br />  //ディスプレイリスト破棄<br />  glDeleteLists(list, Length);<br />  list = 0;<br />  Length = 0;<br /> }</p> <p>GLFONT *font;</p> <p>void display(void)<br /> {<br />  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);<br />  glColor4f(0.0f, 0.0f, 1.0f, 1.0f);<br />  font-&gt;DrawStringW(10,120,L"PlaySoundで再生しています。");<br />  glutSwapBuffers();<br /> }<br /> void idle(void)<br /> {<br />  glutPostRedisplay();<br /> }<br /> void Init(){<br />  glClearColor(1.0, 1.0, 1.0, 1.0);<br />  glOrtho(0, WIDTH, HEIGHT, 0, -1, 1);<br />  font = new GLFONT(L"MS明朝", 24);</p> <p> DWORD dwReadSize;<br />  HANDLE FileHandle=CreateFile(L"sample.wav",GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);<br />  if(FileHandle==INVALID_HANDLE_VALUE){<br />      MessageBox(NULL,L"ファイルが開けません",L"ERROR!!",MB_OK);<br />  }<br />  DWORD dwFileSize=GetFileSize(FileHandle,NULL);<br />  Sound=(LPCWSTR)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,dwFileSize);<br />  ReadFile(FileHandle,(LPVOID)Sound,dwFileSize,&amp;dwReadSize,NULL);<br />  CloseHandle(FileHandle);<br />  PlaySound(Sound,NULL,SND_MEMORY | SND_ASYNC | SND_LOOP);<br /> }<br /> void Release(){<br />  PlaySound(NULL,NULL,0);<br />     HeapFree(GetProcessHeap(),0,(LPVOID)Sound);<br />  MessageBox(NULL,L"解放して終了します。",L"END",MB_OK);<br />     PostQuitMessage(0);<br /> }<br /> int main(int argc, char *argv[])<br /> {<br />  glutInitWindowPosition(100, 100);<br />  glutInitWindowSize(WIDTH, HEIGHT);<br />  glutInit(&amp;argc, argv);<br />  glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);<br />  glutCreateWindow("wavを再生");<br />  glutSetOption(GLUT_ACTION_ON_WINDOW_CLOSE,GLUT_ACTION_GLUTMAINLOOP_RETURNS);//メインループから戻ってくる設定<br />  glutDisplayFunc(display);<br />  glutIdleFunc(idle);<br />  Init();<br />  glutMainLoop();<br />  Release();<br />  return 0;<br /> }</p> </td> </tr></tbody></table><p> </p>
<p><strong>Win32API の PlaySound を使用して .wav を再生します。<br /> glutSetOption(GLUT_ACTION_ON_WINDOW_CLOSE,GLUT_ACTION_GLUTMAINLOOP_RETURNS); を<br /> 指定すると freeglut の場合、 glutMainLoop(); から戻ってくる事が可能です。<br /> いつも解放はOSまかせにしている管理人ですが、今回は解放コードも記述しました。</strong></p> <p><strong><img alt="" src="http://cdn21.atwikiimg.com/opengl?cmd=upload&amp;act=open&amp;pageid=123&amp;file=sound.png" /></strong></p> <table border="1" cellpadding="1" cellspacing="1" style="width:300px;"><tbody><tr><td>ファイル</td> </tr><tr><td><a href="http://cdn21.atwikiimg.com/opengl?cmd=upload&amp;act=open&amp;pageid=123&amp;file=main.cpp"> main.cpp</a></td> </tr><tr><td>sample.wav (自分で用意して下さい)</td> </tr></tbody></table><p>main.cpp</p> <table border="1" cellpadding="1" cellspacing="1" width="600"><tbody><tr><td> <p>#pragma comment(linker, "/SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup")<br /> #pragma comment(lib,"winmm.lib")<br /> #include &lt;windows.h&gt;<br /> #include &lt;mmsystem.h&gt;</p> <p>#include &lt;GL/freeglut/freeglut.h&gt;<br /> #include &lt;stdio.h&gt;</p> <p>#define WIDTH 320<br /> #define HEIGHT 240</p> <p>LPCWSTR Sound;</p> <p>class GLFONT<br /> {<br /> public:<br />  HFONT Hfont;<br />  HDC Hdc;<br />  GLFONT(wchar_t *fontname, int size);<br />  void DrawStringW(int x,int y,wchar_t *format, ...);<br /> };<br /> //コンストラクタ フォント作成<br /> GLFONT::GLFONT(wchar_t *fontname, int size)<br /> {<br />  Hfont = CreateFontW(<br />         size,      //フォント高さ<br />         0,       //文字幅<br />         0,       //テキストの角度<br />         0,       //ベースラインとx軸との角度<br />         FW_REGULAR,     //フォントの太さ<br />         FALSE,      //イタリック体<br />         FALSE,      //アンダーライン<br />         FALSE,      //打ち消し線<br />         SHIFTJIS_CHARSET,   //文字セット<br />         OUT_DEFAULT_PRECIS,   //出力精度<br />         CLIP_DEFAULT_PRECIS,  //クリッピング精度<br />         ANTIALIASED_QUALITY,  //出力品質<br />         FIXED_PITCH | FF_MODERN, //ピッチとファミリー<br />         fontname);     //書体名</p> <p> Hdc = wglGetCurrentDC();<br />  SelectObject(Hdc, Hfont);<br /> }<br /> //ワイド文字列の描画<br /> void GLFONT::DrawStringW(int x,int y,wchar_t *format, ...)<br /> {<br />  wchar_t buf[256];<br />  va_list ap;<br />  int Length=0;<br />  int list=0;<br />  <br />  //ポインタがNULLの場合は終了<br />  if ( format == NULL )<br />   return;</p> <p> //文字列変換<br />  va_start(ap, format);<br />  vswprintf_s(buf, format, ap);<br />  va_end(ap);</p> <p> Length = wcslen(buf);<br />  list = glGenLists(Length);<br />  for( int i=0; i&lt;Length; i++ ){<br />   wglUseFontBitmapsW(Hdc, buf[i], 1, list + (DWORD)i);<br />  }</p> <p> glDisable(GL_LIGHTING);<br />  glRasterPos2i(x, y);<br />  //ディスプレイリストで描画<br />  for( int i=0; i&lt;Length; i++ )<br />  {<br />   glCallList(list + i);<br />  }<br />  glEnable(GL_LIGHTING);<br />  //ディスプレイリスト破棄<br />  glDeleteLists(list, Length);<br />  list = 0;<br />  Length = 0;<br /> }</p> <p>GLFONT *font;</p> <p>void display(void)<br /> {<br />  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);<br />  glColor4f(0.0f, 0.0f, 1.0f, 1.0f);<br />  font-&gt;DrawStringW(10,120,L"PlaySoundで再生しています。");<br />  glutSwapBuffers();<br /> }<br /> void idle(void)<br /> {<br />  glutPostRedisplay();<br /> }<br /> void Init(){<br />  glClearColor(1.0, 1.0, 1.0, 1.0);<br />  glOrtho(0, WIDTH, HEIGHT, 0, -1, 1);<br />  font = new GLFONT(L"MS明朝", 24);</p> <p> DWORD dwReadSize;<br />  HANDLE FileHandle=CreateFile(L"sample.wav",GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);<br />  if(FileHandle==INVALID_HANDLE_VALUE){<br />      MessageBox(NULL,L"ファイルが開けません",L"ERROR!!",MB_OK);<br />  }<br />  DWORD dwFileSize=GetFileSize(FileHandle,NULL);<br />  Sound=(LPCWSTR)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,dwFileSize);<br />  ReadFile(FileHandle,(LPVOID)Sound,dwFileSize,&amp;dwReadSize,NULL);<br />  CloseHandle(FileHandle);<br />  PlaySound(Sound,NULL,SND_MEMORY | SND_ASYNC | SND_LOOP);<br /> }<br /> void Release(){<br />  PlaySound(NULL,NULL,0);<br />     HeapFree(GetProcessHeap(),0,(LPVOID)Sound);<br />  MessageBox(NULL,L"解放して終了します。",L"END",MB_OK);<br />     PostQuitMessage(0);<br /> }<br /> int main(int argc, char *argv[])<br /> {<br />  glutInitWindowPosition(100, 100);<br />  glutInitWindowSize(WIDTH, HEIGHT);<br />  glutInit(&amp;argc, argv);<br />  glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);<br />  glutCreateWindow("wavを再生");<br />  glutSetOption(GLUT_ACTION_ON_WINDOW_CLOSE,GLUT_ACTION_GLUTMAINLOOP_RETURNS);//メインループから戻ってくる設定<br />  glutDisplayFunc(display);<br />  glutIdleFunc(idle);<br />  Init();<br />  glutMainLoop();<br />  Release();<br />  return 0;<br /> }</p> </td> </tr></tbody></table><p> </p>

表示オプション

横に並べて表示:
変化行の前後のみ表示: