12.ÄÝ¹é ¸Þ½ÃÁö

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½ºÆÃÇÏ¸é µÈ´Ù.

ÀÌÁ¦ Àç»ýÁß¿¡µµ âÀ» À̵¿Çϰųª Å©±â¸¦ ¹Ù²Ü ¼ö ÀÖ°í ¾ðÁ¦µçÁö Á¾·áÇÒ ¼öµµ ÀÖ´Ù. ´ÜÀÏ ½º·¹µåÀÌÁö¸¸ ¸Þ½ÃÁö ÆßÇÎÀ» ÇÏ°í ÀÖ¾î Àç»ýÁß¿¡µµ ¸Þ½ÃÁö 󸮰¡ °¡´ÉÇÏ´Ù. ±×·¯³ª ¹Ù·Î È£ÃâÇÏ´Â Äݹé ÇÔ¼ö¿¡ ºñÇØ ¸Þ½ÃÁö Å¥¸¦ °ÅÄ¡´Ù º¸´Ï È¿À²ÀÌ ÁÁÁö ¸øÇÏ´Ù. ¹öÆÛ°¡ ºÎÁ·ÇÏ¸é ¼Ò¸®°¡ ¶Ò¶Ò ²÷¾îÁö´Â ¹®Á¦°¡ Àִµ¥ ¹öÆÛ¸¦ ÃæºÐÈ÷ ´Ã·ÁÁÖ¸é ÇØ°áµÈ´Ù.