「.wavを再生する(win32API)」の編集履歴(バックアップ)一覧はこちら
追加された行は緑色になります。
削除された行は赤色になります。
<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&act=open&pageid=123&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&act=open&pageid=123&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 <windows.h><br />
#include <mmsystem.h></p>
<p>#include <GL/freeglut/freeglut.h><br />
#include <stdio.h></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<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<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->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,&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(&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&act=open&pageid=123&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&act=open&pageid=123&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 <windows.h><br />
#include <mmsystem.h></p>
<p>#include <GL/freeglut/freeglut.h><br />
#include <stdio.h></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<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<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->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,&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(&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>