8. ¹öÆÛ ±¸Á¶

ÀÌ ¿¹Á¦´Â 3°³ÀÇ Çì´õ¸¦ »ç¿ëÇÏ¸ç °¢ Çì´õ´Â »ùÇà µ¥ÀÌÅÍ ÀúÀåÀ» À§ÇØ ¹öÆÛ¸¦ Çϳª¾¿ ÇÒ´çÇÏ¿© lpData ¸â¹ö°¡ °¡¸®Å²´Ù. ¹è¿­°ú Æ÷ÀÎÅÍ°¡ ÁßøµÇ¸é ³»ºÎ ±¸Á¶°¡ º¹ÀâÇØÁö°í Çò°¥¸®´Âµ¥ ÀÌ·² ¶§´Â ±×¸²À¸·Î ¸Þ¸ð¸® ±¸Á¶¸¦ ±×·Á º¸´Â °ÍÀÌ ÁÁ´Ù.

¹è¿­ ¾È¿¡ ±¸Á¶Ã¼ 3°³°¡ ÀÖ°í °¢ ±¸Á¶Ã¼ÀÇ lpData ¸â¹ö°¡ 10KÀÇ ¹öÆÛ¸¦ ÇÒ´çÇÏ¿© °¡¸®Å°´Â »óȲÀÌ´Ù. C ¹®¹ýÀÇ ±âº»¸¸ ¾Ë¾Æµµ ÀÌ Á¤µµ´Â ²­ÀÌÁö¸¸ ÁßøÀÇ ´Ü°è°¡ ±í¾îÁö¸é ±¸Á¶°¡ Àß ÆľǵÇÁö ¾Ê°í Á÷Á¢ °ü¸®Çϱâ´Â ´õ ¾î·Æ´Ù. ¾ÐÃà Æ÷¸ËÀº ³»ºÎ°¡ »ó»ó ÀÌ»óÀ¸·Î º¹ÀâÇØ À¢¸¸ÇÑ ³»°øÀ¸·Î´Â ±¸Á¶¸¦ ÆľÇÇϱ⠽±Áö ¾Ê´Ù. ¿ª½Ã C ¾ð¾îÀÇ ¹é¹Ì´Â Æ÷ÀÎÅÍÀ̸ç ÃæºÐÇÑ ¿¬½ÀÀ» ÇØ µÎ¾î¾ß ÇÑ´Ù.

ÀÌ ¿¹Á¦ÀÇ ¹öÆÛ´Â Àü¿ª ¹è¿­ Çϳª¿Í µ¿Àû ÇÒ´çÇÑ ¹öÆÛ·Î ±¸¼ºµÇ¾î ºñ±³Àû ´Ü¼øÇÏÀÌ´Ù. ÀÌ ¿Ü¿¡µµ ¶È°°Àº ¸ñÀû¿¡ »ç¿ëÇÒ ¼ö ÀÖ´Â ¿©·¯ °¡Áö º¯ÇüµÈ Çü½ÄÀÌ ÀÖ°í °¢ Çü½Ä¸¶´Ù Àå´ÜÁ¡ÀÌ ÀÖ´Ù. ¶ÇÇÑ ¾Ë°í ÀÖ´õ¶óµµ ½ÇÀü¿¡¼­´Â »ðÁúÀ» ÇÏ°Ô µÇ´Â À§Çè ¿ä¼Ò°¡ °÷°÷¿¡ µµ»ç¸®°í ÀÖ´Ù. ¿¬½À »ï¾Æ ´Ù¸¥ Çü½ÄÀÇ ¹öÆÛ¸¦ ¸¸µé¾î º¸°í °¡±ÞÀû ´Ü¼øÈ­½ÃÄÑ º¸ÀÚ.

 

¢º ÀÌ ¿¹Á¦´Â Çì´õÀÇ °³¼ö°¡ óÀ½ºÎÅÍ 3°³·Î °íÁ¤µÇ¾î ÀÖ´Ù. Çì´õÀÇ °³¼ö¸¦ ½ÇÇàÁß¿¡ À¯¿¬ÇÏ°Ô °áÁ¤ÇÏ·Á¸é µ¿ÀûÀ¸·Î ÇÒ´çÇØ¾ß ÇÑ´Ù. µ¿Àû ÇÒ´çÀ» ÇÏ·Á¸é ¹è¿­ÀÌ ¾Æ´Ñ Æ÷ÀÎÅÍ Å¸ÀÔÀ¸·Î ¼±¾ðÇÑ´Ù.

 

WAVEHDR *hdr;

 

Æ÷ÀÎÅ͸¦ ÇÒ´çÇÏ¸é °ð ¹è¿­ÀÌ µÇ¸ç ÇÒ´ç·®¿¡ µû¶ó ¹è¿­ÀÇ ±æÀÌ°¡ °áÁ¤µÈ´Ù. ¹öÆÛ¸¦ ÇÒ´çÇϱâ Àü¿¡ Çì´õºÎÅÍ ÇÒ´çÇÑ´Ù.

 

hdr = (WAVEHDR*)calloc(hdrnum, sizeof(WAVEHDR));

for (int i = 0; i < hdrnum; i++) {

         hdr[i].lpData = (char*)malloc(bufsize);

}

 

callocÀ¸·Î WAVEHDR ±¸Á¶Ã¼¸¦ hdrnum °³¼ö¸¸Å­ ÇÒ´çÇÏ°í ±× ½ÃÀÛ ¹øÁö¸¦ hdr¿¡ ´ëÀÔÇϸé hdrnum °³¼öÀÇ ¹è¿­ÀÌ µÈ´Ù. ÀÌ ¹è¿­ÀÇ lpData ¸â¹ö¿¡ ¹öÆÛ¸¦ ÇÒ´çÇß´Ù. Çì´õ¸¦ µ¿Àû ÇÒ´çÇßÀ¸´Ï ´Ù ¾´ ÈÄ ÇØÁ¦µµ ÇØ¾ß Çϴµ¥ ÇÒ´çÇÒ ¶§¿Í ¹Ý´ë ¼ø¼­·Î ¹öÆÛ ¸ÕÀú ÇØÁ¦ÇÏ°í Çì´õ¸¦ ÇØÁ¦ÇÑ´Ù.

 

         for (int i = 0; i < hdrnum; i++) {

                      waveOutUnprepareHeader(hWaveDev, &hdr[i], sizeof(WAVEHDR));

                      free(hdr[i].lpData);

         }

         free(hdr);

         waveOutClose(hWaveDev);

         CloseHandle(hFile);

         return 0;

}

 

½ÇÇàÇØ º¸¸é ¶È°°ÀÌ µ¿ÀÛÇÑ´Ù. ±×·¯³ª ¿©±â¿¡ ÇÔÁ¤ÀÌ µµ»ç¸®°í ÀÖ´Ù. µ¿Àû ÇÒ´çÀÌ´Ï ´ç±Ù mallocÀÌÁö, ¶ó°í »ý°¢ÇÏ°í ´ÙÀ½°ú °°ÀÌ ÇÒ´çÇØ ¹ö¸®¸é Å«ÀÏ ³­´Ù.

 

hdr = (WAVEHDR*)malloc(hdrnum * sizeof(WAVEHDR));

 

mallocÀº ¸Þ¸ð¸®¸¦ ÇҴ縸 ÇÒ »Ó ÃʱâÈ­´Â ÇÏÁö ¾Ê´Â´Ù. ¹Ý¸é callocÀº ÇÒ´ç°ú µ¿½Ã¿¡ ¸ðµç ¸Þ¸ð¸®¸¦ 0À¸·Î ÃʱâÈ­ÇÏ´Â Â÷ÀÌ°¡ ÀÖ´Ù. ÇҴ縸 ÇÏ°í ÃʱâÈ­ÇÏÁö ¾ÊÀ¸¸é Çì´õÀÇ ¸ðµç ¸â¹ö´Â ¾²·¹±â°ªÀ» °¡Áö¸ç ÀÌÈÄÀÇ µ¿ÀÛÀº º¸ÁõÇÒ ¼ö ¾ø´Ù. ÀÌ »óȲÀ» ´õ Á÷°üÀûÀ¸·Î »ìÆì º¸·Á¸é ¾ÖÃÊÀÇ Äڵ忡¼­ Çì´õ ¹è¿­À» mainÀÇ Áö¿ª º¯¼ö·Î ¼±¾ðÇØ º¸¸é µÈ´Ù.

 

int main()

{

         WAVEHDR hdr[hdrnum];

 

hdr´Â main¿¡¼­¸¸ ¾²°í ´Ù¸¥ ÇÔ¼öµµ ¾øÀ¸´Ï mainÀÇ Áö¿ª º¯¼ö¿©µµ »ó°ü ¾ø´Ù. ±×·¯³ª Àü¿ª º¯¼ö´Â ÃʱâÈ­µÇÁö¸¸ Áö¿ª º¯¼ö´Â ÃʱâÈ­µÇÁö ¾Ê´Â´Ù´Â Å« Â÷ÀÌÁ¡ÀÌ ÀÖ´Ù. Á¤ Áö¿ª º¯¼ö·Î ¼±¾ðÇÏ·Á¸é ¾²·¹±â¸¦ ¸»²ûÈ÷ Ä¡¿ö ÁÖ¾î¾ß ÇÑ´Ù.

 

int main()

{

         WAVEHDR hdr[hdrnum] = { NULL, };

 

µÎ ¼±¾ð¹®Àº ¾öû³­ Â÷ÀÌ°¡ ÀÖ´Ù. C ¹®¹ýÀ» ¹è¿üÀ¸¸é Áö¿ª º¯¼ö´Â ÃʱâÈ­µÇÁö ¾ÊÀ½À» ¾Ë°í ÀÖÁö¸¸ ½ÇÀü¿¡¼­´Â ±ô¹ÚÇÒ ¼ö ÀÖ°í µ¿Àû ÇÒ´çÇÏ¸é ½Ç¼öÀÇ °¡´É¼ºÀÌ ´õ ³ô¾ÆÁø´Ù. Çѹø µÈÅë ´çÇØ º¸¸é ÀÌÈÄ¿¡´Â Á¶½ÉÇÏ°Ô µÈ´Ù.

¢º ÀÌ¿Õ Çì´õ¸¦ µ¿ÀûÀ¸·Î ÇÒ´çÇß´Ù¸é ¾Æ¿¹ ¹öÆÛ±îÁö ÇÑ ¹­À½À¸·Î ÇÒ´çÇÒ ¼ö ÀÖ´Ù. ÇÊ¿äÇÑ ÃÑ ±æÀ̸¸Å­ ÇÒ´çÇØ ³õ°í Çì´õ°¡ ¹öÆÛ¸¦ °¡¸®Å°´Â Çü½ÄÀÌ´Ù. Çì´õÀÇ °³¼ö³ª ¹öÆÛÀÇ ±æÀ̱îÁö ¸¶À½´ë·Î °áÁ¤ÇÒ ¼ö ÀÖ¾î À¯¿¬ÇÏ´Ù.

 

hdr = (WAVEHDR *)calloc(hdrnum, sizeof(WAVEHDR) + bufsize);

char* bufstart = (char *)hdr + sizeof(WAVEHDR) * hdrnum;

for (int i = 0; i < hdrnum; i++) {

         hdr[i].lpData = bufstart + bufsize * i;

}

 

Çì´õ¿Í ¹öÆÛ Å©±â¸¸Å­ÀÇ ¸Þ¸ð¸®¸¦ hdrnum°³¸¸Å­ ÇÒ´çÇÏ¿© hdr¿¡ ´ëÀÔÇß´Ù. À̶§µµ ¹°·Ð callocÀ¸·Î ÇÒ´çÇØ¾ß ÇÑ´Ù. hdr¿¡ ÇÒ´çÇÑ ¸Þ¸ð¸®ÀÇ ¾ÕÂÊ ¼ÂÀº WAVEHDR ±¸Á¶Ã¼·Î »ç¿ëÇÏ°í ³ª¸ÓÁö µÚÂÊÀº bufsize¸¸Å­¾¿ À߶ó »ùÇà µ¥ÀÌÅÍ ¹öÆÛ·Î »ç¿ëÇÑ´Ù. Çì´õ ¼¼ °³ºÐ¸¸Å­ °Ç³Ê¶Ù°í ·çÇÁ¸¦ µ¹¸ç °¢ ¹öÆÛÀÇ ¹øÁö¸¦ ã¾Æ lpData ¸â¹ö¿¡ ´ëÀÔÇÑ´Ù. ÀÌ·¯¸é ¼¼ °³ÀÇ Çì´õ°¡ »ý¼ºµÇ°í °¢ Çì´õ¸¶´Ù ÀÚ½ÅÀÇ ¹öÆÛ¸¦ °¡Áø´Ù.

Å­Áö¸·ÇÑ ¸Þ¸ð¸®¸¦ µü Çϳª¸¸ ÇÒ´çÇØ ³õ°í ¾ÕÂÊÀº Çì´õ ±¸Á¶Ã¼ ¹è¿­·Î, µÚÂÊÀº »ùÇà µ¥ÀÌÅÍ¿ë ¹öÆÛ·Î À߶ó »ç¿ëÇÏ´Â ¹æ½ÄÀÌ´Ù. ÇÒ´çÇÑ ¸Þ¸ð¸®°¡ Çϳª »ÓÀ̹ǷΠÇØÁ¦ÇÒ ¶§ °³º° ¹öÆÛ´Â ÇØÁ¦ÇÒ ÇÊ¿ä ¾øÀÌ Çì´õ¸¸ ÇØÁ¦ÇÏ¸é µÈ´Ù.

 

for (int i = 0; i < hdrnum; i++) {

         waveOutUnprepareHeader(hWaveDev, &hdr[i], sizeof(WAVEHDR));

}

free(hdr);

 

ÇÑ µ¢¾î¸®·Î ÇÒ´çÇصµ »ç¿ëÇÒ ¶§´Â hdr[0], hdr[1] ½ÄÀ¸·Î ±¸Á¶Ã¼ ¹è¿­ÀÎ °Íó·³ »ç¿ëÇÏ¸é µÈ´Ù. hdrÀÇ ´ë»óü ŸÀÔÀÌ WAVEHDR ±¸Á¶Ã¼¿©¼­ ¿ä¼Ò Å©±â´Â µü ±¸Á¶Ã¼ Å©±â¸¸Å­ÀÌ´Ù. T ŸÀÔÀÇ Æ÷ÀÎÅÍ´Â °ð T ŸÀÔÀÇ ¹è¿­ÀÌ¸ç ¹è¿­Àº ¶ÇÇÑ Æ÷ÀÎÅÍ »ó¼öÀÌ´Ù.

¢º Çì´õ´Â ¹è¿­ »óÅ·ΠµÎ°í °¢ Çì´õ¸¶´Ù ¹öÆÛ¸¦ ÇÒ´çÇÏÁö ¸»°í ÇÑ µ¢¾î¸®¸¸ ÇÒ´çÇؼ­ ³ª´² ÁÖ´Â ¹æ½Äµµ ÀÖ´Ù. Çì´õÀÇ Å©±â°¡ Á¤ÀûÀ̶ó¸é ÀÌ ¹æ¹ýµµ °£ÆíÇÏ´Ù.

 

char* samplebuf = (char*)malloc(bufsize * bufnum);

for (int i = 0; i < bufnum; i++) {

         hdr[i].lpData = samplebuf + bufsize * i;

}

 

¾ÕÀÇ ¹æ¹ý°ú ºñ½ÁÇ쵂 ¹öÆÛ¸¸ ÅëÀ¸·Î ÇÒ´çÇÑ´Ù´Â Á¡ÀÌ ´Ù¸£´Ù. ÇØÁ¦ÇÒ ¶§´Â free(samplebuf); ¹®ÀåÀ¸·Î Çѹø¿¡ ¸Þ¸ð¸®¸¦ Á¤¸®ÇÑ´Ù.

¢º Çì´õÀÇ Å©±â°¡ Á¤ÀûÀÌ°í ¹öÆÛÀÇ Å©±âµµ Á¤ÀûÀ̶ó¸é ¾Æ¿¹ µÑ ´Ù Àü¿ªÀ¸·Î ¼±¾ðÇØ ³õ°í »ç¿ëÇÒ ¼ö ÀÖ´Ù. Çì´õ¸¦ ¹è¿­·Î ¼±¾ðÇÏ°í ¹öÆÛ´Â 2Â÷ ¹è¿­·Î ¼±¾ðÇÑ´Ù.

 

WAVEHDR hdr[hdrnum];

char samplebuf[hdrnum][bufsize];

 

ÀÌ µÑÀº º°°³ÀÇ ¸Þ¸ð¸®À̹ǷΠlpData ¸â¹ö¸¦ ÅëÇØ ¿¬°áÇØ ÁÖ¾î¾ß ÇÑ´Ù. Æ÷ÀÎÅͳ¢¸® ÄÄÆÄÀÏÁß¿¡ ¿¬°áÇÒ ¼ö ¾øÀ¸¹Ç·Î Äڵ尡 ÇÊ¿äÇÏ´Ù.

 

for (int i = 0; i < hdrnum; i++) {

         hdr[i].lpData = samplebuf[i];

}

 

Àü¿ª ¹è¿­Àº ÇÁ·Î¼¼½º¿Í ¿î¸íÀ» ÇÔ²² ÇϹǷΠÇØÁ¦ÇÒ ÇÊ¿ä ¾ø´Ù. ±×·¯¹Ç·Î »ç½Ç»ó Áغñ ÇØÁ¦ °úÁ¤µµ ÇÊ¿ä ¾ø´Ù. ±×³É ¸¾´ë·Î ¾²´Ù°¡ ÇÁ·Î±×·¥À» Á¾·áÇϸé ÀÚµ¿À¸·Î ±ò²ûÇÏ°Ô ÇØÁ¦µÈ´Ù. °¡Àå °£ÆíÇÏ°í ¸»½éÀÇ ¿©Áö°¡ ¾øÁö¸¸ ÄÄÆÄÀÏ Áß¿¡ Å©±â¸¦ ¹Ì¸® °áÁ¤ÇØ¾ß ÇÑ´Ù´Â Á¦¾àÀÌ ÀÖ´Ù. ±æÀ̸¦ ¹Ì¸® ¾Ë°í ÀÖÀ¸¸é Á¤Àû ÇÒ´çÀÌ ÆíÇÏ°í ½ÇÇàÁß¿¡ °áÁ¤ÇÏ·Á¸é µ¿Àû ÇÒ´çÇØ¾ß ÇÑ´Ù.

 

ÀÌ»óÀÇ ½Ç½À¿¡¼­ ºÃ´Ù½ÃÇÇ ¶È°°Àº ¹®Á¦¸¦ Ǫ´Âµ¥µµ ¿©·¯ °¡Áö ¹æ¹ýÀÌ ÀÖ´Ù. ´Ù ³ª¸§´ë·Î Àå´ÜÁ¡ÀÌ ÀÖ°í »óȲ¿¡ µü ¾î¿ï¸®´Â ¹æ¹ýÀÌ Àִµ¥ ÀÚÀ¯ÀÚÀç·Î ¿øÇÏ´Â ¹æ¹ýÀ» °ñ¶ó ¾µ ¼ö ÀÖ¾î¾ß ÇÑ´Ù. ¿ì¸®ÀÇ ¿¹Á¦¿¡¼­´Â ¸¶Áö¸· ¹æ¹ýÀÌ Á¦ÀÏ °£´ÜÇϹǷΠ´ÙÀ½ ¿¹Á¦ºÎÅÍ´Â ÀÌ ¹æ¹ýÀ» ¾²±â·Î ÇÑ´Ù.