ÀÌ ¿¹Á¦´Â 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];
}
Àü¿ª ¹è¿Àº ÇÁ·Î¼¼½º¿Í ¿î¸íÀ» ÇÔ²² ÇϹǷΠÇØÁ¦ÇÒ ÇÊ¿ä ¾ø´Ù. ±×·¯¹Ç·Î
»ç½Ç»ó Áغñ ÇØÁ¦ °úÁ¤µµ ÇÊ¿ä ¾ø´Ù. ±×³É ¸¾´ë·Î ¾²´Ù°¡ ÇÁ·Î±×·¥À» Á¾·áÇϸé ÀÚµ¿À¸·Î ±ò²ûÇÏ°Ô ÇØÁ¦µÈ´Ù. °¡Àå °£ÆíÇÏ°í ¸»½éÀÇ ¿©Áö°¡ ¾øÁö¸¸ ÄÄÆÄÀÏ Áß¿¡ Å©±â¸¦ ¹Ì¸® °áÁ¤ÇØ¾ß ÇÑ´Ù´Â Á¦¾àÀÌ ÀÖ´Ù. ±æÀ̸¦ ¹Ì¸® ¾Ë°í ÀÖÀ¸¸é Á¤Àû ÇÒ´çÀÌ ÆíÇÏ°í ½ÇÇàÁß¿¡ °áÁ¤ÇÏ·Á¸é µ¿Àû ÇÒ´çÇØ¾ß ÇÑ´Ù.
ÀÌ»óÀÇ ½Ç½À¿¡¼ ºÃ´Ù½ÃÇÇ ¶È°°Àº ¹®Á¦¸¦ Ǫ´Âµ¥µµ ¿©·¯ °¡Áö ¹æ¹ýÀÌ ÀÖ´Ù. ´Ù
³ª¸§´ë·Î Àå´ÜÁ¡ÀÌ ÀÖ°í »óȲ¿¡ µü ¾î¿ï¸®´Â ¹æ¹ýÀÌ Àִµ¥ ÀÚÀ¯ÀÚÀç·Î ¿øÇÏ´Â ¹æ¹ýÀ» °ñ¶ó ¾µ ¼ö ÀÖ¾î¾ß ÇÑ´Ù. ¿ì¸®ÀÇ
¿¹Á¦¿¡¼´Â ¸¶Áö¸· ¹æ¹ýÀÌ Á¦ÀÏ °£´ÜÇϹǷΠ´ÙÀ½ ¿¹Á¦ºÎÅÍ´Â ÀÌ ¹æ¹ýÀ» ¾²±â·Î ÇÑ´Ù.