Waveform APIÀÇ Äݹé ÇÔ¼ö´Â ¾²±â´Â °£ÆíÇÏÁö¸¸ ¸î °¡Áö ¹®Á¦°¡
ÀÖ´Ù. Àç»ýÁß¿¡ »ç¿îµå µð¹ÙÀ̽º µå¶óÀ̹ö¿¡ ÀÇÇØ È£ÃâµÇ¸ç ½º·¹µå ÄÁÅؽºÆ®°¡ ´Ù¸£´Ï ¿©·¯ °¡Áö ¸»½éÀÌ
»ý±ä´Ù.
¢º ¸ÞÀÎ ½º·¹µå¿Í ´Þ¸® È£ÃâÇÒ ¼ö ÀÖ´Â API
ÇÔ¼öÀÇ Á¦¾àÀÌ ÀÖ´Ù. ÀϹÝÀûÀ¸·Î ÀÛ¾÷ ½º·¹µå¿¡¼´Â ³»ºÎÀûÀΠ󸮸¸ ÇØ¾ß ÇÏ¸ç ±×·¡ÇÈ °ü·Ã
Ãâ·ÂÀ» Çؼ´Â ¾ÈµÈ´Ù. ¾Æ¹« ÇÔ¼ö³ª È£ÃâÇÏ¸é µ¥µå¶ô¿¡ °É·Á ´Ù¿îµÇ´Â °Í°ú °°´Ù.
¢º ÀϺΠ»ç¿îµå Ĩ¼Â¿¡¼ ÄݹéÀÌ Á¦´ë·Î È£ÃâµÇÁö ¾Ê´Â ¹ö±×°¡ °£°£È÷ ÀÖ´Ù. µð¹ÙÀ̽º µå¶óÀ̹öµµ ´ç¿¬È÷ ¹ö±×°¡ ÀÖÀ» ¼ö ÀÖÁö¸¸ ¹ß»ý ºóµµ°¡ ³ôÀº ÆíÀÌ´Ù.
¸Å¹ø ÆÐÄ¡°¡ ¹ßÇ¥µÇÁö¸¸ »õ »ç¿îµå Ä«µå°¡ ³ª¿Ã ¶§¸¶´Ù ¹®Á¦°¡ ¹ß»ýÇØ ¸ðµç ½Ã½ºÅÛ¿¡¼ ´Ù Àß µ¿ÀÛÇÑ´Ù°í º¸ÀåÇÒ ¼ö ¾ø´Ù.
¢º 32ºñÆ®¸¸ Àß Áö¿øÇÒ »Ó 64ºñÆ®¿Í ȣȯµÇÁö ¾Ê´Â´Ù. À§ ¿¹Á¦¸¦ x64·Î ¹Ù²ã ÄÄÆÄÀÏÇØ º¸¸é ÀåÄ¡ ¿ÀÇ °úÁ¤¿¡¼ ¹ú½á ´Ù¿îµÇ¾î ¹ö¸°´Ù. ¿î¿µÃ¼Á¦ÀÇ
¹ö±×Àε¥ °íÄ¥ »ý°¢µµ ÇÏÁö ¾ÊÀ¸¸ç ¸¶¶¥ÇÑ ÇØ°áÃ¥µµ ¾ø´Ù. ¿ö³« ¿À·¡µÈ ¶óÀ̺귯¸®ÀÌ°í Áö±ÝÀº ´ëüǰÀÌ
¸¹¾Æ MS°¡ ¹«½Å°æÇÏ´Ù.
´ÙÇàÈ÷ Àç»ýÁß¿¡ ÄݹéÀ» ¹Þ´Â ¹æ¹ýÀº ÇÔ¼ö ¿Ü¿¡µµ ¿©·¯ °¡Áö ¹æ¹ýÀÌ ÀÖ´Ù. À©µµ¿ì·Î
ÄݹéÀ» ¹ÞÀ¸¸é ¸Þ½ÃÁö¸¦ Àü´ÞÇØ ÁÖ¸ç ÀÌ ¹æ¹ýÀº Ç×»ó Àß µ¿ÀÛÇÑ´Ù. ¾Õ ¿¹Á¦ÀÇ ÄÝ¹é °ü·Ã Äڵ带 ¼öÁ¤ÇØ
º¸ÀÚ.
¢º ÀåÄ¡ ¿ÀÇ ÇÔ¼öÀÇ ÄÝ¹é ¹æ¹ýÀ» ¹Ù²Û´Ù. Ç÷¡±×¸¦ CALLBACK_WINDOW·Î ÁöÁ¤ÇÏ°í ¸Þ½ÃÁö¸¦ ¹ÞÀ» ¸ÞÀÎ À©µµ¿ìÀÇ ÇÚµéÀ» Àü´ÞÇÑ´Ù.
waveOutOpen(&hWaveDev, WAVE_MAPPER, &wf,
(DWORD_PTR)hWndMain, 0, CALLBACK_WINDOW);
¢º WndProc¿¡ ´ÙÀ½ ¸Þ½ÃÁö ó¸® ·çƾÀ» Ãß°¡ÇÑ´Ù. ÀÌÀü ¹öÀüÀÇ Äݹé ÇÔ¼ö°¡ ÇÏ´ø µ¿ÀÛ°ú °°´Ù. ÀÌÁ¦ Äݹé ÇÔ¼ö´Â ÇÊ¿ä
¾øÀ¸´Ï Á¦°ÅÇÑ´Ù.
case MM_WOM_DONE:
InterlockedIncrement(&availhdr);
return
0;
¢º ¸ÞÀÎ ½º·¹µå°¡ »ç¿îµå¸¦ Àç»ýÇÏ°í ÄÝ¹é ¸Þ½ÃÁöµµ °°ÀÌ ¹Þ´Ù º¸´Ï ÀÌ´ë·Î ½ÇÇàÇÏ¸é µ¥µå¶ô¿¡ °É¸°´Ù. Àç»ý ÄÚµå ½ÇÇàÁß¿¡´Â ÄÝ¹é ¸Þ½ÃÁö¸¦ ó¸®ÇÏÁö ¸øÇÏ°í ±×·¯´Ù º¸¸é
availhdr°¡ Áõ°¡ÇÏÁö ¾Ê¾Æ ¹«ÇÑ ´ë±âÇÏ´Â »óÅ°¡ µÈ´Ù. availhdr¸¦ ´ë±âÇÏ´Â
Áß¿¡µµ ¸Þ½ÃÁö¸¦ ó¸®Çϵµ·Ï ¸Þ½ÃÁö ÆßÇÎ Äڵ带 Ãß°¡ÇÑ´Ù.
while (availhdr == 0) {
MSG
Message;
if
(PeekMessage(&Message, NULL, 0, 0, PM_REMOVE)) {
if
(Message.message == WM_QUIT) {
PostQuitMessage(0);
return
0;
}
TranslateMessage(&Message);
DispatchMessage(&Message);
}
Sleep(20);
}
¢º ±×·¡ÇÈ È¯°æÀÇ ÇÁ·Î±×·¥Àº ¾ðÁ¦µç ÀçÁøÀÔÀÌ °¡´ÉÇÏ´Ù. »ç¿îµå¸¦ Àç»ýÇÏ°í
ÀÖ´Â Áß¿¡µµ ¸¶¿ì½º ¿ÞÂÊ ¹öÆ°À» ´©¸¦ ¼ö ÀÖ¾î ¼Ò¸®°¡ ÀÌÁßÀ¸·Î ³ª¿Ã ¼ö ÀÖ´Ù. Áߺ¹ Àç»ýÀ» ¹æÁöÇϱâ
À§ÇØ ÇöÀç Àç»ýÁßÀÎÁö ±â¾ïÇÏ´Â isPlaying º¯¼ö¸¦ Ãß°¡ÇÏ°í Àç»ýÁß¿¡ true·Î ¼³Á¤ÇÏ°í ³¡³ª¸é false·Î ¸®¼ÂÇÑ´Ù. PlayWave¿¡¼ ÀÌ º¯¼ö¸¦ Á¡°ËÇÏ¿© Àç»ýÁß¿¡´Â ±×³É ¸®ÅÏÇÑ´Ù.
bool isPlaying = false;
int PlayWave(LPCTSTR song)
{
if
(isPlaying) {
return
0;
}
isPlaying
= true;
....
isPlaying
= false;
return
0;
}
ÀÌÁ¦ 64ºñÆ®·Îµµ ÄÄÆÄÀÏµÇ°í ¼Ò¸®µµ Àß ³ª¿Â´Ù. ±×·¯³ª ÄÄÆÄÀÏ ¿É¼ÇÀÌ ¹Ù²ñÀ¸·Î ÀÎÇØ ¸î °¡Áö °æ°í°¡ ¹ß»ýÇϴµ¥ ±×³É µÖµµ »ó°üÀº ¾øÁö¸¸ À̽ļºÀ» À§ÇØ ¼öÁ¤Çϵµ·Ï
ÇÏÀÚ. ´ÙÀ½ µÎ ±ºµ¥¸¦ ¼öÁ¤ÇÑ´Ù.
hdr[nowhdr].dwBufferLength = DWORD(bufptr -
samplebuf[nowhdr]);
int remainbuf = int(bufsize - (bufptr -
samplebuf[nowhdr]));
Æ÷ÀÎÅͳ¢¸® »©°Å³ª Æ÷ÀÎÅÍ¿Í Á¤¼ö¸¦ ¿¬»êÇÏ¸é ±× °á°úµµ Á¤¼öÀÌ´Ù. 32ºñÆ®
ȯ°æ¿¡¼´Â Æ÷ÀÎÅÍ ¿¬»êÀÇ °á°ú°¡ 32ºñÆ®¿©¼ DWORD³ª int ŸÀÔÀÇ º¯¼ö¿¡ ¹Ù·Î ´ëÀÔÇÒ ¼ö ÀÖÁö¸¸ 64ºñÆ® ȯ°æ¿¡¼´Â °á°ú°¡ __int64¿©¼ Á¿ì ŸÀÔÀÌ ¸ÂÁö ¾Ê´Ù. ±Ù°Å¸® Æ÷ÀÎÅͳ¢¸® ¿¬»êÀÌ¾î¼ 32ºñÆ® ¹üÀ§¸¦ ¹þ¾î³¯ ¸®´Â ¾øÀ¸´Ï DWORD¿Í int·Î ij½ºÆÃÇÏ¸é µÈ´Ù.
ÀÌÁ¦ Àç»ýÁß¿¡µµ âÀ» À̵¿Çϰųª Å©±â¸¦ ¹Ù²Ü ¼ö ÀÖ°í ¾ðÁ¦µçÁö Á¾·áÇÒ ¼öµµ ÀÖ´Ù. ´ÜÀÏ ½º·¹µåÀÌÁö¸¸ ¸Þ½ÃÁö ÆßÇÎÀ» ÇÏ°í ÀÖ¾î Àç»ýÁß¿¡µµ ¸Þ½ÃÁö 󸮰¡ °¡´ÉÇÏ´Ù.
±×·¯³ª ¹Ù·Î È£ÃâÇÏ´Â Äݹé ÇÔ¼ö¿¡ ºñÇØ ¸Þ½ÃÁö Å¥¸¦ °ÅÄ¡´Ù º¸´Ï È¿À²ÀÌ ÁÁÁö ¸øÇÏ´Ù. ¹öÆÛ°¡
ºÎÁ·ÇÏ¸é ¼Ò¸®°¡ ¶Ò¶Ò ²÷¾îÁö´Â ¹®Á¦°¡ Àִµ¥ ¹öÆÛ¸¦ ÃæºÐÈ÷ ´Ã·ÁÁÖ¸é ÇØ°áµÈ´Ù.