2¡§D?¨¦¨´¨°?

2¡§D?¨¦¨´¨°?¨º?¡Á?3¡ê¨®?¦Ì?Windows?¨¤??¨¬?¨¬?D??¡ê2¡§D?¨¦¨´¨°?¨¦¨¨¡À??¨¦¨°?¨ª¡§1y?¨®??¡¤?2?¡Á?¨¦¨´¨°?¡ê?2¡é????¡Áa???a¨ºy?¦Ì¡ê?¨¨?o¨®¡ã??¨¹??¡ä¡é¡ä?¦Ì??¨²¡ä??¨°??¡ä??¨¬¨¦?¦Ì?2¡§D????t?D¡ê?2¡§D????t¦Ì?¨¤??1??¨º?.WAV?¡ê?a?¨´¡ê?¨¦¨´¨°??¨ª?¨¦¨°?2£¤¡¤?¨¢??¡ê

¨¦¨´¨°?¨®?2¡§D?

?¨²?¨®¡ä£¤2¡§D?¨¦¨´¨°?API???¡ã¡ê???¡À?¨°?D??¡è¡À??a¨º?o¨¹??¨°a¡ê??aD??a¨º?¡ã¨¹¨¤¡§??¨¤¨ª?¡ì?¡é¨¬y??¨°??¡ã¨¦¨´¨°???3??????¨²¦Ì?3¨¬D¨°?¡ê

¨¦¨´¨°??¨ª¨º????¡¥?¡ê¦Ì¡À¨¦¨´¨°???¡À?¨¢?1??¡è¨¦?????¦Ì??1¨¢|¨º¡À¡ê??¨°???¨ª?D??¦Ì?¨¢?¨¦¨´¨°??¡ê?¨®??¡¤??¨¦¨°??D¨®|?aD????¡¥¡ê?2¡é?¨°???¨¹??¡Áa???a¦Ì?¨¢¡Â?¡ê¨ª??¨´¡ê?¦Ì?¨¢¡Â?¨´?-1y¡¤?¡ä¨®?¡Âo¨ª¨¤?¨°??¡Â¡ê??¨ª¨®?¡À?3¨¦¨¢?¨¦¨´¨°??¡ê¡ä?¨ª3¨¦?¡ê?¨¦¨´¨°?¨°??¡ê?a¡¤?¨º?¡ä¡é¡ä?¡ê¡§¨¤y¨¨???¨°?¡ä?¡ä?o¨ª3a??¡ê?¡ê??aD????¡¥¡ä¡é¡ä??¨²¡ä?????3??¨°????¨¤a¡ã?2??D?¡ê¦Ì¡À¨¦¨´¨°?¡Áa???a¦Ì?¨¢¡Â¨º¡À¡ê??¨ª?¨¦¨°?¨®???¨º¡À?????¡¥¦Ì?2¡§D?¨¤¡ä¡À¨ª¨º??¡ê???¡¥¡Á?¡Á?¨¨?¦Ì?D?¨º??¨¦¨°?¨®??y?¨°2¡§¡À¨ª¨º?¡ê??¨¹¦Ì?¨°????¨¹?¨²¨¨? ¨ª?5-5 ?¨´¨º??¡ê

?y?¨°2¡§¨®D¨¢???2?¨ºy?a?a??¡¤¨´¡ê¡§¨°2?¨ª¨º?¨°????¨¹?¨²?D¦Ì?¡Á?¡ä¨®??¡¤¨´¡ê?o¨ª?¦Ì?¨º?¡ê?¨°??¨°??a??¡¤¨´?¨ª¨º?¨°?¨¢?¡ê??¦Ì?¨º?¨ª¨º?¨°?¦Ì¡Â?¡ê¨°?¡ã?¨¤¡ä?¦Ì¨¨??¨²?¨¦?D¨º¨¹¦Ì??y?¨°2¡§¦Ì?¡¤??¡ì¨º?¡ä¨®20Hz¡ê¡§?????¨¹?¨²¡ê?¦Ì?¦Ì¨ª?¦Ì¨¦¨´¨°?¦Ì?20,000Hz¦Ì????¦Ì¨¦¨´¡ê?¦Ì???¡Á??¨º¨¢?¦Ì???3¡è¡ê??????¦Ì¨¦¨´¨°?¦Ì??D¨º¨¹?¨¹¨¢|?¨¢?e?¨º¨ª??¡¥?¡ê

¨¨??D¨º¨¹?¦Ì?¨º¦Ì??¨¹¨¢|¨®??¦Ì?¨º¨º???¨ºy1??¦Ì??2?¨º???D?1??¦Ì?¡ê¨°2?¨ª¨º??¦Ì¡ê??¨°???D¨º¨¹20Hz¦Ì?40Hz¦Ì??¦Ì?¨º¡À??¡¥¨®??D¨º¨¹40Hz¦Ì?80Hz¦Ì??¦Ì?¨º¡À??¡¥¨º?¨°??¨´¦Ì??¡ê?¨²¨°?¨¤??D¡ê??a???¨®¡À?¦Ì??¦Ì?¨º?¡§¨°??a¡ã??¨¨¨°??¡Á?¡ê¨°¨°¡ä?¡ê?¨¨??¨²?¨¦?D??¦Ì?¡ä¨®??10??¡ã??¨¨¨°??¡Á¦Ì?¨¦¨´¨°??¡ê???¨´¦Ì?¡¤??¡ì¨º?¡ä¨®27.5 Hz¦Ì?4186 Hz????¡ê???D?¨®¨²7??¡ã??¨¨¨°??¡Á?¡ê

??¨¨??y?¨°2¡§¡ä¨²¡À¨ª¨¢????¡¥¦Ì?¡ä¨®?¨¤¨ºy¡Á?¨¨?D?¨º?¡ê?¦Ì?¡ä??y?¨°2¡§o¨¹¨¦¨´?¨²??¨º¦Ì¨¦¨²???D¦Ì£¤?¨¤3???¡ê????¨°¡ê?¡ä??y?¨°2¡§2¡é2??¡¥¨¬y?¡ê¡ä¨®?¨¤¨ºy¨¦¨´¨°???o¨¹?¡ä?¨®?¡ê

¨¨?o??¨¹?¨²¦Ì?2¡§D?¡ê¡§?¡ä¡ê?¨°????-?¡¤2¡§D?¡ê??¨¦¨°?¡¤??a3¨¦?¨¤???y?¨°2¡§¡ê??aD??y?¨°2¡§¦Ì??¦Ì?¨º??¨º???¡À?¨ºy?¡ê?a?¨ª¨º??¨´??¦Ì?Fourier??¨ºy¡ê??¨¹¨°?¡¤¡§1¨²¨ºy?¡ì?¨°o¨ª??¨¤¨ª?¡ì?¨°Jean Baptiste Joseph Fourier¡ê¡§1768-1830¡ê?¦Ì???¡Á??¨¹???¡ê?¨¹?¨²¦Ì??¦Ì?¨º¨º??¨´¡ä??¡ê??¨ºy?D???¨¹?y?¨°2¡§¦Ì??¦Ì?¨º¨º??¨´¡ä??¦Ì?¨º¦Ì?2¡À??¡é3¡À??¡é4¡À?¡ê¡§¦Ì¨¨¦Ì¨¨¡ê??¡ê?aD??¦Ì?¨º¦Ì?¨¦¨´¨°?3??a¡¤o¨°??¡ê?¨´¡ä??¦Ì?¨º¨°23?¡Á¡Â¨°???D32¡§?¡ê¦Ì¨²¨°?¡¤o¨°?¨º??t??D32¡§¡ê?¨°?¡ä?¨¤¨¤¨ª??¡ê

?y?¨°2¡§D32¡§¦Ì??¨¤?????¨¨???????¨¹?¨²¦Ì?2¡§D??¡§¨°?¦Ì?¨¦¨´¨°??¡ê?a?¨ª¨º??¡ã¨°??¨º?¡À¡ê??¨¹¨º1¦Ì?¨¤?¡ã¨¨¡ä¦Ì3?¨¤?¡ã¨¨¨¦¨´¡ê????¨´¦Ì¡¥3????¨´¨¦¨´?¡ê

¨¨???¨°??¨¨¨¨??a¦Ì?¡Á¨®o?3¨¦¨¤??¡Â????D¨¨¨°a??¨¦¨´¨°?¡¤??a3¨¦D32¡§2¡é?¨°¨®??¨¤???y?¨°2¡§??¡Á¨¦?¡ä?¨¦?¡ê2?1y¡ê?¨º?¨º¦Ì?¡è?¡Â??¨º¦Ì¨º¨¤???D¦Ì?¨¦¨´¨°?2¡é2?¨º??a?¡ä?¨°¦Ì£¤?¡ê¡ä¨²¡À¨ª??¨º¦Ì¨º¨¤???D¨¦¨´¨°?¦Ì?2¡§D?????¨®D????¦Ì??¨¹?¨²?¡ê¨¤??¡Â????D32¡§¦Ì??¨¤?????¨¨¨º?2?¨ª?¦Ì?¡ê?2¡é?¨°D32¡§¨°2??¡Á?????¨°?¡¤?¦Ì??Y¡Á¨¤¨º¡À????¡À??¡ê¨¬?¡Àe¨º?¨¤??¡Â?Y¡Á¨¤¨°?¡¤?¦Ì??a¨º??????a?a?¨°??3?¡Á¡Â?e¡Á¨¤¡ê¡§attack¡ê??a?a?¨¤¦Ì¡À?¡ä?¨®¡ê?¦Ì??a??????¨®????¨°???D¨º¨¹¨°??¨º?¨¢1???¨°a?¡ê

¨®¨¦¨®¨²?¨¹?¨º¨¤¡ä¨ºy¡Á?¡ä¡é¡ä??¨¹¨¢|¦Ì?¨¬¨¢??¡ê??¨°???¨¦¨°???¨¦¨´¨°??¡À?¨®¨°?¨ºy¡Á?D?¨º?¡ä¡é¡ä???2?¨®??¡ä?¨®¦Ì???¡Á¨¦?¡ê

??3?¡À¨¤??¦Ì¡Â??¡ê¡§Pulse Code Modulation¡ê?

?????¨²¡ä|¨¤¨ª¦Ì?¨º?¨ºy?¦Ì¡ê?¨°¨°¡ä?¨°a¨º1¨¦¨´¨°???¨¨??????¨²¡ê??¨ª¡À?D?¨¦¨¨??¨°????¨¹??¨¦¨´¨°?¨®?¨ºy¡Á?D?o??¨¤?£¤¡Áa??¦Ì??¨²???¡ê

2??1??¨ºy?Y?¨ª¨ª¨º3¨¦¡ä?1|?¨¹¦Ì?¡Á?3¡ê¨®?¡¤?¡¤¡§3?¡Á¡Â?¡ã??3?¡À¨¤??¦Ì¡Â???¡À¡ê¡§PCM¡êopulse code modulation¡ê??¡êPCM?¨¦¨®??¨²1a?¨¬?¡é¨ºy¡Á?¨º???¨°?¡ä?¡ä?¨°??¡ãWindows?D?¡ê??3?¡À¨¤??¦Ì¡Â????¨º¦Ì??¨º?¨°???????¨¦?o¨¹?¨°¦Ì£¤¦Ì?¡ä|¨¤¨ª2??¨¨¦Ì???1?¡ä¨²??¡ä¨º??¨°??¡ê

¨¤?¨®???3?¡À¨¤??¦Ì¡Â??¡ê?2¡§D??¨¦¨°?¡ã¡ä1¨¬?¡§¦Ì??¨¹?¨²?¦Ì?¨º¨¨??¨´¡ê????¦Ì?¨º¨ª¡§3¡ê¨º???????¨ª¨°¡ä??¡ê??¨®¨²?????¨´¡À???2a¨¢???2¡§D?¦Ì???¡¤¨´?¡ê¨ª¨º3¨¦????¡¤¨´¡Áa??3¨¦¨ºy¡Á?D?o?1¡è¡Á¡Â¦Ì?¨®2?t¨º??¡ê?a¨ºy¡Á?¡Áa???¡Â¡ê¡§ADC¡êoanalog-to-digital converter¡ê??¡ê¨¤¨¤??¦Ì?¡ê?¨ª¡§1y¨ºy¡Á??¡ê?a¡Áa???¡Â¡ê¡§DAC¡êodigital-to-analog converter¡ê??¨¦??¨ºy¡Á?D?o?¡Áa????2¡§D?¦Ì?¡Á¨®D?o??¡ê¦Ì??a?¨´¡Áa??¦Ì?¦Ì?¦Ì?2¡§D?¨®?¨º?¨¨?¦Ì?2¡é2?¨ª¨º¨¨??¨¤¨ª??¡êo?3¨¦¦Ì?2¡§D???¨®D¨®¨¦???¦Ì¡Á¨¦3¨¦¦Ì??a¨¨?¡À??¦Ì?¡ê¨°¨°¡ä?¡ê?2£¤¡¤?¨®2?t¨ª¡§3¡ê?¨²¨ºy¡Á??¡ê?a¡Áa???¡Âo¨®?1¡ã¨¹¨¤¡§¨°???¦Ì¨ª¨ª¡§??2¡§?¡Â?¡ê¡ä???2¡§?¡Â??¦Ì????¦Ì¡ê?2¡é¨º1o?3¨¦o¨®¦Ì?2¡§D??¨¹?????¡ê?¨²¨º?¨¨???¡ê?¦Ì¨ª¨ª¡§??2¡§?¡Â??¨®¨²ADC?¡ã???¡ê

??3?¡À¨¤??¦Ì¡Â??¨®D¨¢???2?¨ºy¡êo¨¨??¨´?¦Ì?¨º¡ê??¡ä?????¨²2a¨¢?2¡§D???¡¤¨´¦Ì?¡ä?¨ºy¡ê??¨´¡À?¡ä¨®D?¡ê??¡ä¨®?¨®¨²¡ä¡é¡ä???¡¤¨´??¦Ì???¨ºy?¡ê¨®??¨²???¨®¦Ì?¨°??¨´¡êo¨¨??¨´?¦Ì?¨º????¡ê??¨´¡À?¡ä¨®D???¡ä¨®¡ê??-¨º?¨¦¨´¨°?¦Ì??¡ä???¡¤2??¨¹o??¡ê2?1y¡ê?¡ä??¨²¨°???¨¬¨¢??¨¨??¨´?¦Ì?¨ºo¨ª?¨´¡À?¡ä¨®D?¦Ì???¦Ì?¡ê?3?1y?a????¦Ì?¨°2?¨ª3?1y¨¢?¨¨?¨¤¨¤¡¤?¡À?¨¦¨´¨°?¦Ì????T?¡ê¨¢¨ª¨ªa¡ê?¨¨?1?¨¨??¨´?¦Ì?¨ºo¨ª?¨´¡À?¡ä¨®D?1y¦Ì¨ª¡ê???¦Ì???2??¨¹??¨¨¡¤¦Ì??¡ä??¨°?¨¤?¨°??¡ã???¨¹¨¦¨´¨°??¡ê

¨¨??¨´?¦Ì?¨º

¨¨??¨´?¦Ì?¨º???¡§¨¦¨´¨°??¨¦¡À?¨ºy¡Á??¡¥o¨ª¡ä¡é¡ä?¦Ì?¡Á?¡ä¨®?¦Ì?¨º?¡ê¨®¨¨??¨º?¡ê?¨¨??¨´?¦Ì?¨º¡À?D?¨º??¨´¡À?¨¦¨´¨°?¡Á????¦Ì?¨º¦Ì?¨¢?¡À??¡ê?a?¨ª¨º??¡ãNyquist?¦Ì?¨º¡ê¡§Nyquist Frequency¡ê??¡À¡ê?¨°?30?¨º¡ä¨²?D??¨¨??¨´3¨¬D¨°¦Ì?1¡è3¨¬¨º|Harry Nyquist¦Ì???¡Á??¨¹???¡ê

¨°?1y¦Ì¨ª¦Ì?¨¨??¨´?¦Ì?¨º???y?¨°2¡§¨¨??¨´¨º¡À¡ê?o?3¨¦¦Ì?2¡§D?¡À¨¨¡Á?3?¦Ì?2¡§D??¦Ì?¨º?¨¹¦Ì¨ª?¡ê?a?¨ª¨º??¨´?¦Ì¦Ì?¨º¡ì??D?o??¡ê?a¡À¨¹?a¨º¡ì??D?o?¦Ì?¡¤¡é¨¦¨²¡ê??¨²¨º?¨¨???¨º1¨®?¦Ì¨ª¨ª¡§??2¡§?¡Â¨°?¡Á¨¨?1?¦Ì?¨º¡ä¨®¨®¨²¡ã???¨¨??¨´?¦Ì?¨º¦Ì??¨´¨®D2¡§D??¡ê?¨²¨º?3???¡ê?¨ºy¡Á??¡ê?a¡Áa???¡Â2¨²¨¦¨²¦Ì?¡ä?2¨²¦Ì?2¡§D?¡À??¦Ì¨º¦Ì?¨º¨¦?¨º?¨®¨¦?¦Ì?¨º¡ä¨®¨®¨²¡ã???¨¨??¨´?¦Ì?¨º¦Ì?2¡§D?¡Á¨¦3¨¦¦Ì?¡¤o¨°??¡ê¨°¨°¡ä?¡ê???¨®¨²¨º?3???¦Ì?¦Ì¨ª¨ª¡§??2¡§?¡Â¨°2¡Á¨¨?1?¦Ì?¨º¡ä¨®¨®¨²¡ã???¨¨??¨´?¦Ì?¨º¦Ì??¨´¨®D2¡§D??¡ê

¨¦¨´¨°?CD?D¨º1¨®?¦Ì?¨¨??¨´?¦Ì?¨º¨º?????44,100???¨´¡À?¡ê??¨°??3??a44.1kHz?¡ê?a??¨¬?¨®D¦Ì?¨ºy?¦Ì¨º??a?¨´2¨²¨¦¨²¦Ì?¡êo

¨¨??¨²?¨¦¨¬y¦Ì?¡Á???20kHz¦Ì?¨¦¨´¨°?¡ê?¨°¨°¡ä?¨°a¨¤1??¨¨??¨¹¨¬y¦Ì?¦Ì?????¨¦¨´¨°?¡¤??¡ì¡ê??¨ªD¨¨¨°a40kHz¦Ì?¨¨??¨´?¦Ì?¨º?¡ê¨¨???¡ê?¨®¨¦¨®¨²¦Ì¨ª¨ª¡§??2¡§?¡Â??¨®D?¦Ì?¨º????D¡ì¨®|¡ê??¨´¨°?¨¨??¨´?¦Ì?¨º¨®|???¨´??3?¡ä¨®??¡ã¨´¡¤???¨º?2?DD?¡ê???¨²¡ê?¨¨??¨´?¦Ì?¨º?¨ª¡ä?¦Ì?¨¢?44kHz?¡ê?a¨º¡À¡ê??¨°??¨°a¨®?¨º¨®?¦Ì¨ª?¨º¡À????¨ºy¡Á?¨¦¨´¨°?¡ê?¨®¨²¨º?¨¨??¨´?¦Ì?¨º?¨ª¨®|??¨º??¨¤1¨²?¡é?¡¤?T¦Ì?¨º¨®??¨º????¨´?¨º¦Ì???¨ºy¡À?¡ê??a¨¢???¨º¨®?¦Ì???¨´?¨º¡¤?¡Àe¨º?30Hzo¨ª25Hz?¡ê?a?¨ª¨º1¨¨??¨´?¦Ì?¨º¨¦y??¦Ì?¨¢?44.1kHz?¡ê

¨¨??¨´?¦Ì?¨º?a44.1kHz¦Ì?1a?¨¬?¨¢2¨²¨¦¨²¡ä¨®¨¢?¦Ì?¨ºy?Y¡ê??a??¨®¨²¨°?D?¨®|¨®?3¨¬D¨°¨¤¡ä?¦Ì¨º¦Ì?¨²¨º?¨¬??¨¤¨¢?¡ê?¨¤y¨¨???¨®¨²????¨¦¨´¨°???2?¨º?????¨°?¨¤?¨º¡À?¨ª¨º??a?¨´?¡ê¡ã?¨¨??¨´?¦Ì?¨º??¡ã?¦Ì?22.05 kHz¡ê??¨¦¨®¨¦¨°???10 kHz¦Ì?¡¤o¨°?¨¤¡ä?¨°?¡¥?¡ä??¨¦¨´¨°?¦Ì?¨¦?¡ã?2?¡¤??¡ê?¨´??????¡ã?¦Ì?11.025 kHz?¨ª?¨°?¨°??¨¬¨¢1?¨¢?5 kHz?¦Ì?¨º¡¤??¡ì?¡ê44.1 kHz?¡é22.05 kHzo¨ª11.025 kHz¦Ì?¨¨??¨´?¦Ì?¨º¡ê?¨°??¡ã8 kHz??¨º?2¡§D?¨¦¨´¨°?¨¦¨¨¡À???¡À¨¦?¡ì3?¦Ì?¡À¨º¡Á??¡ê

¨°¨°?a???¨´¦Ì?¡Á????¦Ì?¨º?a4186 Hz¡ê??¨´¨°??¨²?¨¦?¨¹?¨¢¨¨??a?????¨´??¨°?¨º¡À¡ê?11.025 kHz¦Ì?¨¨??¨´?¦Ì?¨º?¨ª¡Á?1?¨¢??¡ê¦Ì?4186 Hz??¨º????¨´¡Á???¦Ì??¨´¡ä??¦Ì?¨º??¨°?¡ê???¦Ì?¡ä¨®¨®¨²5000Hz¦Ì??¨´¨®D?y?¨°2¡§????¨¦¨´?¨¦¡À??¡ä??¦Ì?¡¤o¨°?¡ê????a?¨´??2??¨¹??¨¨¡¤¦Ì?2?¡Á?o¨ª?¡ä?????¨´¦Ì?¨¦¨´¨°??¡ê

?¨´¡À?¡ä¨®D?

??3?¡À¨¤??¦Ì¡Â??¦Ì?¦Ì¨²?t??2?¨ºy¨º?¡ã¡ä??????¦Ì??¨´¡À?¡ä¨®D??¡ê?¨´¡À?¡ä¨®D????¡§¨¢??¨¦1?????o¨ª2£¤¡¤?¦Ì?¡Á?¦Ì¨ª¨°?¨®?¡Á???¨°?????¦Ì???¡Àe?¡ê?a?¨ª¨º?¨ª¡§3¡ê?¨´?¦Ì¦Ì??¡¥¨¬?¡¤??¡ì?¡ê

¨¦¨´¨°????¨¨¨º?2¡§D???¡¤¨´¦Ì???¡¤?¡ê¡§?¡ä?????y?¨°2¡§¨°????¨¹?¨²?D¡Á?¡ä¨®??¡¤¨´¦Ì?o?3¨¦¡ê??¡ê¨®??¦Ì?¨º¨°??¨´¡ê?¨¨???¨¦¨´¨°????¨¨¦Ì??D¨º¨¹¨°23¨º??¨ºy¡À??¡¥?¡ê

¨¢???¨¦¨´¨°??¨²???¨¨¨¦?¦Ì???¡Àe¨º?¨°?¡À¡ä??¡ê¡§¨°?¦Ì??¡ã¡¤¡é?¡Â¨¨?Alexander Graham Bell¦Ì???¡Á??¨¹??¡ê?o¨ª¡¤?¡À¡ä¡ê¡§dB¡ê??a¦Ì£¤????DD2a¨¢?¦Ì??¡ê1¡À¡ä???¨²¨¦¨´¨°????¨¨¨¦?3¨º10¡À????¨®?¡ê1dB?¨ª¨º?¨°??¨¤¨ª?¦Ì?3?¡¤¡§2??¨¨3¨¦?a1¡À¡ä??¦Ì?¨º?¡¤???¨°??¡ê¨®¨¦¡ä?¡ê?1dB?¨¦???¨®¨¦¨´¨°????¨¨¦Ì?1.26¡À?¡ê¡§10¦Ì?10¡ä?¡¤??¨´¡ê?¡ê??¨°?????¨®2¡§D???¡¤¨´¦Ì?1.12¡À?¡ê¡§10¦Ì?20¡ä?¡¤??¨´¡ê??¡ê1¡¤?¡À¡ä¨º??¨²???¨¦?D??3?¦Ì?¨¦¨´??¦Ì?¡Á?D?¡À??¡¥?¡ê¡ä¨®?a¨º??¨¹¨¬y¦Ì?¦Ì?¨¦¨´¨°????T¦Ì?¨¨?¨¨??D¦Ì?¨¬?¨ª¡ä¦Ì?¨¦¨´¨°????T????¦Ì?¨¦¨´??2?¡ä¨®??¨º?100 dB?¡ê

?¨¦¨®?????¦Ì?1?¨º?¨¤¡ä????¨¢???¨¦¨´¨°???¦Ì??¡¥¨¬?¡¤??¡ì¡ê?¦Ì£¤??¨º?¡¤?¡À¡ä¡êo

???DA1o¨ªA2¨º?¨¢???¨¦¨´¨°?¦Ì???¡¤¨´?¡ê¨°¨°?a???¨¦?¨¹¨®D¨°?????¡¤¨´¡ê??¨´¨°??¨´¡À?¡ä¨®D?¨º?1??¡ê??¡¥¨¬?¡¤??¡ì¨º?0?¡ê

¨¨?1??¨´¡À?¡ä¨®D?¨º?8??¡ê??¨°¡Á?¡ä¨®??¡¤¨´¨®?¡Á?D???¡¤¨´????¦Ì?¡À¨¨¨¤y?¨ª¨º?256?¡ê?a?¨´¡ê??¡¥¨¬?¡¤??¡ì?¨ª¨º?¡êo

?¨°??48¡¤?¡À¡ä?¡ê48¦Ì??¡¥¨¬?¡¤??¡ì¡ä¨®???¨¤¦Ì¡À¨®¨²¡¤?3¡ê¡ã2?2¦Ì?¡¤??Y¨®?¦Ì??¡¥??2Y?¨²????¦Ì?2?¡Àe?¡ê???¨´¡À?¡ä¨®D??¨®¡À?¦Ì?16??2¨²¨¦¨²¦Ì??¡¥¨¬?¡¤??¡ì¨º?¡êo

?¨°??96¡¤?¡À¡ä?¡ê?a¡¤?3¡ê?¨®?¨¹¨¬y?????To¨ª¨¬?¨ª¡ä???T¡ê????¨°¨¨???¨¨??a?a?¨ª¨º??¡ä??¨°?¨¤?¦Ì?¨¤¨ª???¦Ì?¡ê

Windows¨ª?¨º¡À?¡ì3?8??o¨ª16??¦Ì??¨´¡À?¡ä¨®D??¡ê¡ä¡é¡ä?8??¦Ì??¨´¡À?¨º¡À¡ê??¨´¡À?¨°??T?y?oo?¡Á??¨²¡ä|¨¤¨ª¡ê??2¨°???¡ä¡é¡ä??a¨°????¦Ì?a0x80¦Ì?¡Á?¡¤?¡ä??¡ê16??¦Ì??¨´¡À?¨°?¡ä??y?oo???¨ºy¡ä|¨¤¨ª¡ê??a¨º¡À?2¨°???¡ä¡é¡ä??a¨°????¦Ì?a0¦Ì?¡Á?¡¤?¡ä??¡ê

¨°a?????¡ä?1??¨¦¨´¨°??¨´D¨¨¦Ì?¡ä¡é¡ä?????¡ê??¨¦¨®?¨°????a¦Ì£¤??¦Ì?¨¦¨´¨°?3?D?¨º¡À??3?¨°?¨¨??¨´?¦Ì?¨º?¡ê¨¨?1?¨®?16???¨´¡À???2?¨º?8???¨´¡À?¡ê??¨°?????¨®¡À?¡ê?¨¨?1?¨º?????¨¢¡é¨¬?¨¦¨´?¨°?¨´?¨®¡À??¡ê¨¤y¨¨?¡ê?1D?¨º¡À¦Ì?CD¨¦¨´¨°?¡ê¡§?¨°??¨º??¨²????¨¢¡é¨¬?¨¦¨´?¨´¡À???2¡Á??¨²?¡é????44 ,100???¨´¡À?¦Ì??¨´?¨¨????DD3 600??¡ê?D¨¨¨°a635MB¡ê??a?¨¬¨°a?¨®?¨¹¨°???CD-ROM¦Ì?¡ä¡é¡ä?¨¢?¨¢??¡ê

?¨²¨¨¨ª?t?D2¨²¨¦¨²?y?¨°2¡§

??¨®¨²¦Ì¨²¨°???1?¨®¨²2¡§D?¨¦¨´¨°?¦Ì?¨¢¡¤?¡ã¡ê??¨°??2?¡ä¨°????¨¦¨´¨°?¡ä¡é¡ä?¦Ì????t?D?¨°2£¤¡¤?????¦Ì?¨¦¨´¨°??¡ê?¨°????¨º1¨®?¦Ì¨ª?¡Á¦Ì?2¡§D?¨¦¨´¨°?API¡ê¡§?¡ä¡ê??¡ã¡Áo¨º?waveOut¦Ì?o¡¥¨ºy¡ê?¨¤¡ä?¡§¨¢¡é¨°???3?¡Á¡ÂSINEWAVE¦Ì?¨¦¨´¨°??y?¨°2¡§¨¦¨²3¨¦?¡Â?¡ê¡ä?3¨¬D¨°¨°?1 Hz¦Ì???¨¢?¨¤¡ä¨¦¨²3¨¦¡ä¨®20Hz¡ê¡§¨¨??¨¦?D??¦Ì?¡Á?¦Ì¨ª?¦Ì¡ê?¦Ì?5,000Hz¡ê¡§¨®?¨¨??D??¦Ì?¡Á????¦Ì?¨¤2?¨¢???¡ã??¨¨¨°??¡Á¡ê?¦Ì??y?¨°2¡§?¡ê

?¨°???a¦Ì¨¤¡ê?¡À¨º¡Á?C??DD¨º¡À?¨²¨¢¡ä?¨®?a¡ã¨¹¨¤¡§¨¢?¨°???sino¡¥¨ºy¡ê???o¡¥¨ºy¡ä???¨°??????¨¨??¦Ì??y?¨°?¦Ì¡ê¡§2|D???¨¨¦Ì¨¨¨®¨²360?¨¨¡ê??¡êsino¡¥¨ºy¡ä????¦Ì¦Ì?¡¤??¡ì¨º?¡ä¨®-1¦Ì?1¡ê¡§???¨²¦Ì¨²????¡ê??¨°???¨ª?¨²SINEWAVE3¨¬D¨°?D¨º1¨®?1y?a??o¡¥¨ºy¡ê??¡ê¨°¨°¡ä?¡ê?¨®|??o¨¹¨¨Y¨°¡Á¨º1¨®?sino¡¥¨ºy¨¦¨²3¨¦¨º?3?¦Ì?2¡§D?¨¦¨´¨°?¨®2?t¦Ì??y?¨°2¡§¨ºy?Y?¡ê?¨´¡À?¨¦?¨º?¨®?¡ä¨²¡À¨ª2¡§D?¡ê¡§?a¨º¡À¨º??y?¨°2¡§¡ê?¦Ì?¨ºy?Y¨¤¡ä¨¬?3??o3???¡ê?2¡é??¡ä??o3???¡ä?¦ÌY??API?¡ê¡ê¡§?a¡À¨¨?¡ã???¨´?2¦Ì?¨¦??¡é¨®DD??¡ä?¨®¡ê?¦Ì??¨°???¨º???¨¦¨¦¨¹¡ê??¡ê2¡§D?¨¦¨´¨°?¨®2?t2£¤¡¤?¨ª¨º?o3????D¦Ì?¨ºy?Yo¨®¡ê?¨®|??¦Ì¨²?t???o3????D¦Ì?¨ºy?Y¡ä?¦ÌY???¨¹¡ê?2¡é?¨°¨°?¡ä?¨¤¨¤¨ª??¡ê

¦Ì¨²¨°?¡ä??????a???¨º¨¬a¡ê¡§???¨°??PCM¨°2¨°??T?¨´?a¡ê?¨º¡À¡ê??¨²¡ä¨®???¨¢¨¨??a??¨°????¨¹?¨²¦Ì??y?¨°2¡§¡¤?3¨¦¨¨??¨¦1¨¬?¡§¨ºy¨¢?¦Ì??¨´¡À??a?a¨¤y¨¨?360???a?a2?o?¨¤¨ª?¡ê??¨®¨²20 Hz¦Ì??y?¨°2¡§¡ê?????¨º?3?7,200???¨´¡À??¡ê??¨®¨²200 Hz¦Ì??y?¨°2¡§¡ê??????¨°¨°a¨º?3?72,000???¨´¡À??¡ê?a¨®D?¨¦?¨¹¨º¦Ì??¡ê?¦Ì?¨º¦Ì?¨º¨¦?¨¨¡ä2??¨¹?a?¡ä¡Á??¡ê??¨®¨²5,000 Hz¦Ì??y?¨°2¡§¡ê??¨ªD¨¨¨°a????¨º?3?1,800,000???¨´¡À?¡ê??a¦Ì?¨¨¡¤?¨¢??¡ä¨®DAC¦Ì??o¦Ì¡ê¡ê??¨¹??¨°a¦Ì?¨º?¡ê???¨®¨²?¨¹??¦Ì??¦Ì?¨º¡ê??a??¡Á¡Â¡¤¡§?¨¢¡À¨¨¨º¦Ì?¨ºD¨¨¨°a¦Ì???¨¨¡¤?¨¨?1???¡ê

?¨ª??3?¡À¨¤??¦Ì¡Â??????¡ê?¨¨??¨´?¦Ì?¨º¨º???3¡ê¨ºy?¡ê?¨´?¡§¨¨??¨´?¦Ì?¨º¨º?SINEWAVE3¨¬D¨°?D¨º1¨®?¦Ì?11,025Hz?¡ê¨¨?1?¨°a¨¦¨²3¨¦¨°???2,756.25Hz¡ê¡§¨¨¡¤?D¦Ì??¦Ì¨º???¡¤???¨°?¦Ì?¨¨??¨´?¦Ì?¨º¡ê?¦Ì??y?¨°2¡§¡ê??¨°?y?¨°2¡§¦Ì??????¨¹?¨²?¨ª¨®D4???¨´¡À??¡ê??¨®¨²25Hz¦Ì??y?¨°2¡§¡ê??????¨¹?¨²?¨ª¨®D441???¨´¡À??¡ê¨ª¡§3¡ê¡ê????¨¹?¨²¦Ì??¨´¡À?¨ºy¦Ì¨¨¨®¨²¨¨??¨´?¦Ì?¨º3y¨°?¨°a¦Ì?¦Ì?¦Ì??y?¨°2¡§?¦Ì?¨º?¡ê¨°?¦Ì??a¦Ì¨¤¨¢????¨¹?¨²¦Ì??¨´¡À?¨ºy¡ê?¨®?2|D???¨¨3y¨°?¡ä?¨ºy¡ê?¨¨?o¨®¨®?sino¡¥¨ºy¨¤¡ä??¦Ì????¨¹?¨²¦Ì??¨´¡À??¡ê¨¨?o¨®?¨´¡¤¡ä?¡ä??¨°????¨¹?¨²??DD¨¨??¨´¡ê?¡ä¨®???¡§¨¢¡é¨°???¨¢?D?¦Ì?2¡§D??¡ê

?¨º¨¬a¨º????¨¹?¨²¦Ì??¨´¡À?¨ºy?¨¦?¨¹¡ä?¨®DD?¨ºy¡ê?¨°¨°¡ä??¨²¨º1¨®?¨º¡À?a??¡¤?¡¤¡§2¡é2?¨º?o¨¹o??¡ê?????¨¹?¨²¦Ì??22????¨¢¨®D?????¡ê

¨º1?¨¹?y3¡ê1¡è¡Á¡Â¦Ì?1??¨¹¨º?¡À¡ê¨¢?¨°????2¨¬?¦Ì??¡ã?¨¤?????¡À¡À?¨ºy?¡ê¡ä???3?¨º??¡¥?a0?¡ê¦Ì¨²¨°????¨´¡À?¨º?0?¨¨?y?¨°?¡ê??o¨®¡ê??¨¤???????¨®¨°????¦Ì¡ê????¦Ì¦Ì¨¨¨®¨²2|D3?¨°??¦Ì?¨º?¨´3y¨°?¨¨??¨´?¦Ì?¨º?¡ê¨®?¡ä??¨¤????¡Á¡Â?a¦Ì¨²?t???¨´¡À?¡ê?2¡é?¨°¡ã¡ä¡ä?¡¤?¡¤¡§?¨¬D??¡ê¨°?¦Ì??¨¤????3?1y2|D???¨¨¡ê??¨°??¨¨£¤2|D???¨¨¡ê???2?¨°a¡ã??¨¤?????¨´3?¨º??¡¥?a0?¡ê

¨¤y¨¨?¡ê??¨´?¡§¨°a¨®?11,025Hz¦Ì?¨¨??¨´?¦Ì?¨º¨¤¡ä¨¦¨²3¨¦1,000Hz¦Ì??y?¨°2¡§?¡ê?¡ä???¨¹?¨²¨®D¡ä¨®??11???¨´¡À??¡ê?a¡À?¨®¨²¨¤¨ª?a¡ê?¡ä?¡ä|?¨¤????¡ã¡ä?¨¨¨ºy??3??a?a¡ä¨®???¡ã¨°???¡ã??¨¹?¨²¦Ì??¨¤????¨º?¡êo0?¡é32.65?¡é65.31?¡é97.96?¡é130.61?¡é163.27?¡é195.92?¡é228.57?¡é261.22?¡é293.88?¡é326.53?¡é359.18?¡é31.84?¡é64.49?¡é97.14?¡é129.80?¡é162.45?¡é195.10¡ê?¨°?¡ä?¨¤¨¤¨ª??¡ê¡ä?¨¨??o3???¦Ì?2¡§D?¨ºy?Y¨º??aD????¨¨¦Ì??y?¨°?¦Ì¡ê?2¡é¨°???¡¤?¦Ì????¨´¡À?¦Ì???¨ºy?¡ê?ao¨®¨¤¡ä¦Ì??o3????¡§¨¢¡é¨ºy?Y¨º¡À¡ê??¨¦?¨¬D????¨®¡Á?o¨®¦Ì??¨¤????¡ê???2?¨°a???¨¹3?¨º??¡¥?a0?¡ê

¨¨?3¨¬D¨°22-2?¨´¨º?¡ê?FillBuffero¡¥¨ºy¨ª¨º3¨¦?a??1¡è¡Á¡Â?a?a¨®?SINEWAVE3¨¬D¨°¦Ì???¨®¨¤2?¡¤?¨°??e¨ª¨º3¨¦?¡ê

 3¨¬D¨°22-2  SINEWAVE
SINEWAVE.C /*------------------------------------------------------------------------- SINEWAVE.C -- Multimedia Windows Sine Wave Generator (c) Charles Petzold, 1998 --------------------------------------------------------------------------*/ #include <windows.h> #include <math.h> #include "resource.h" #define SAMPLE_RATE 11025 #define FREQ_MIN 20 #define FREQ_MAX 5000 #define FREQ_INIT 440 #define OUT_BUFFER_SIZE 4096 #define PI 3.14159 BOOL CALLBACK DlgProc (HWND, UINT, WPARAM, LPARAM) ; TCHAR szAppName [] = TEXT ("SineWave") ; int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { if (-1 == DialogBox (hInstance, szAppName, NULL, DlgProc)) { MessageBox ( NULL, TEXT ("This program requires Windows NT!"), szAppName, MB_ICONERROR) ; } return 0 ; } VOID FillBuffer (PBYTE pBuffer, int iFreq) { static double fAngle ; int i ; for (i = 0 ; i < OUT_BUFFER_SIZE ; i++) { pBuffer [i] = (BYTE) (127 + 127 * sin (fAngle)) ; fAngle += 2 * PI * iFreq / SAMPLE_RATE ; if ( fAngle > 2 * PI) fAngle -= 2 * PI ; } } BOOL CALLBACK DlgProc ( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { static BOOL bShutOff, bClosing ; static HWAVEOUT hWaveOut ; static HWND hwndScroll ; static int iFreq = FREQ_INIT ; static PBYTE pBuffer1, pBuffer2 ; static PWAVEHDR pWaveHdr1, pWaveHdr2 ; static WAVEFORMATEX waveformat ; int iDummy ; switch (message) { case WM_INITDIALOG: hwndScroll = GetDlgItem (hwnd, IDC_SCROLL) ; SetScrollRange (hwndScroll, SB_CTL, FREQ_MIN, FREQ_MAX, FALSE) ; SetScrollPos (hwndScroll, SB_CTL, FREQ_INIT, TRUE) ; SetDlgItemInt (hwnd, IDC_TEXT, FREQ_INIT, FALSE) ; return TRUE ; case WM_HSCROLL: switch (LOWORD (wParam)) { case SB_LINELEFT: iFreq -= 1 ; break ; case SB_LINERIGHT: iFreq += 1 ; break ; case SB_PAGELEFT: iFreq /= 2 ; break ; case SB_PAGERIGHT: iFreq *= 2 ; break ; case SB_THUMBTRACK: iFreq = HIWORD (wParam) ; break ; case SB_TOP: GetScrollRange (hwndScroll, SB_CTL, &iFreq, &iDummy) ; break ; case SB_BOTTOM: GetScrollRange (hwndScroll, SB_CTL, &iDummy, &iFreq) ; break ; } iFreq = max (FREQ_MIN, min (FREQ_MAX, iFreq)) ; SetScrollPos (hwndScroll, SB_CTL, iFreq, TRUE) ; SetDlgItemInt (hwnd, IDC_TEXT, iFreq, FALSE) ; return TRUE ; case WM_COMMAND: switch (LOWORD (wParam)) { case IDC_ONOFF: // If turning on waveform, hWaveOut is NULL if (hWaveOut == NULL) { // Allocate memory for 2 headers and 2 buffers pWaveHdr1 = malloc (sizeof (WAVEHDR)) ; pWaveHdr2 = malloc (sizeof (WAVEHDR)) ; pBuffer1 = malloc (OUT_BUFFER_SIZE) ; pBuffer2 = malloc (OUT_BUFFER_SIZE) ; if (!pWaveHdr1 || !pWaveHdr2 || !pBuffer1 || !pBuffer2) { if (!pWaveHdr1) free (pWaveHdr1) ; if (!pWaveHdr2) free (pWaveHdr2) ; if (!pBuffer1) free (pBuffer1) ; if (!pBuffer2) free (pBuffer2) ; MessageBeep (MB_ICONEXCLAMATION) ; MessageBox (hwnd, TEXT ("Error allocating memory!"), szAppName, MB_ICONEXCLAMATION | MB_OK) ; return TRUE ; } // Variable to indicate Off button pressed bShutOff = FALSE ; // Open waveform audio for output waveformat.wFormatTag = WAVE_FORMAT_PCM ; waveformat.nChannels = 1 ; waveformat.nSamplesPerSec = SAMPLE_RATE ; waveformat.nAvgBytesPerSec = SAMPLE_RATE ; waveformat.nBlockAlign = 1 ; waveformat.wBitsPerSample = 8 ; waveformat.cbSize = 0 ; if (waveOutOpen (&hWaveOut, WAVE_MAPPER, &waveformat, DWORD) hwnd, 0, CALLBACK_WINDOW)!= MMSYSERR_NOERROR) { free (pWaveHdr1) ; free (pWaveHdr2) ; free (pBuffer1) ; free (pBuffer2) ; hWaveOut = NULL ; MessageBeep (MB_ICONEXCLAMATION) ; MessageBox (hwnd, TEXT ("Error opening waveform audio device!"), szAppName, MB_ICONEXCLAMATION | MB_OK) ; return TRUE ; } // Set up headers and prepare them pWaveHdr1->lpData = pBuffer1 ; pWaveHdr1->dwBufferLength = OUT_BUFFER_SIZE ; pWaveHdr1->dwBytesRecorded = 0 ; pWaveHdr1->dwUser = 0 ; pWaveHdr1->dwFlags = 0 ; pWaveHdr1->dwLoops = 1 ; pWaveHdr1->lpNext = NULL ; pWaveHdr1->reserved = 0 ; waveOutPrepareHeader (hWaveOut, pWaveHdr1, sizeof (WAVEHDR)) ; pWaveHdr2->lpData = pBuffer2 ; pWaveHdr2->dwBufferLength = OUT_BUFFER_SIZE ; pWaveHdr2->dwBytesRecorded = 0 ; pWaveHdr2->dwUser = 0 ; pWaveHdr2->dwFlags = 0 ; pWaveHdr2->dwLoops = 1 ; pWaveHdr2->lpNext = NULL ; pWaveHdr2->reserved = 0 ; waveOutPrepareHeader (hWaveOut, pWaveHdr2, sizeof (WAVEHDR)) ; } // If turning off waveform, reset waveform audio else { bShutOff = TRUE ; waveOutReset (hWaveOut) ; } return TRUE ; } break ; // Message generated from waveOutOpen call case MM_WOM_OPEN: SetDlgItemText (hwnd, IDC_ONOFF, TEXT ("Turn Off")) ; // Send two buffers to waveform output device FillBuffer (pBuffer1, iFreq) ; waveOutWrite (hWaveOut, pWaveHdr1, sizeof (WAVEHDR)) ; FillBuffer (pBuffer2, iFreq) ; waveOutWrite (hWaveOut, pWaveHdr2, sizeof (WAVEHDR)) ; return TRUE ; // Message generated when a buffer is finished case MM_WOM_DONE: if (bShutOff) { waveOutClose (hWaveOut) ; return TRUE ; } // Fill and send out a new buffer FillBuffer (((PWAVEHDR) lParam)->lpData, iFreq) ; waveOutWrite (hWaveOut, (PWAVEHDR) lParam, sizeof (WAVEHDR)) ; return TRUE ; case MM_WOM_CLOSE: waveOutUnprepareHeader (hWaveOut, pWaveHdr1, sizeof (WAVEHDR)) ; waveOutUnprepareHeader (hWaveOut, pWaveHdr2, sizeof (WAVEHDR)) ; free (pWaveHdr1) ; free (pWaveHdr2) ; free (pBuffer1) ; free (pBuffer2) ; hWaveOut = NULL ; SetDlgItemText (hwnd, IDC_ONOFF, TEXT ("Turn On")) ; if (bClosing) EndDialog (hwnd, 0) ; return TRUE ; case WM_SYSCOMMAND: switch (wParam) { case SC_CLOSE: if (hWaveOut != NULL) { bShutOff = TRUE ; bClosing = TRUE ; waveOutReset (hWaveOut) ; } else EndDialog (hwnd, 0) ; return TRUE ; } break ; } return FALSE ; }
 SINEWAVE.RC ¡ê¡§?a??¡ê?
//Microsoft Developer Studio generated resource script. #include "resource.h" #include "afxres.h" ///////////////////////////////////////////////////////////////////////////// // Dialog SINEWAVE DIALOG DISCARDABLE 100, 100, 200, 50 STYLE WS_MINIMIZEBOX | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "Sine Wave Generator" FONT 8, "MS Sans Serif" BEGIN SCROLLBAR IDC_SCROLL,8,8,150,12 RTEXT "440",IDC_TEXT,160,10,20,8 LTEXT "Hz",IDC_STATIC,182,10,12,8 PUSHBUTTON "Turn On",IDC_ONOFF,80,28,40,14 END
 RESOURCE.H ¡ê¡§?a??¡ê?
// Microsoft Developer Studio generated include file. // Used by SineWave.rc #define IDC_STATIC -1 #define IDC_SCROLL 1000 #define IDC_TEXT 1001 #define IDC_ONOFF 1002

¡Á¡é¨°a¡ê?FillBuffer¨¤y3¨¬?D¨®?¦Ì?¦Ì?OUT_BUFFER_SIZE?¡éSAMPLE_RATEo¨ªPI¡À¨º¨º?¡¤??¨²3¨¬D¨°¦Ì??£¤2??¡§¨°??¡êFillBuffer¦Ì?iFreq2?¨ºy¨º?D¨¨¨°a¦Ì??¦Ì?¨º¡ê?¦Ì£¤??¨º?Hz?¡ê?1¨°a¡Á¡é¨°a¡ê?sino¡¥¨ºy¦Ì??¨¢1?¦Ì¡Â??¦Ì?¨¢?0¦Ì?254¦Ì?¡¤??¡ì?????¡ê??¨®¨²?????¨´¡À?¡ê?sino¡¥¨ºy¦Ì?fAngle2?¨ºy?????¨®¨°????¦Ì¡ê????¦Ì¦Ì?¡ä¨®D?¨º?2|D???¨¨3?¨°?D¨¨¨°a¦Ì??¦Ì?¨º?¨´3y¨°?¨¨??¨´?¦Ì?¨º?¡ê

SINEWAVE¦Ì?¡ä¡ã?¨²¡ã¨¹o?¨¨y?????t¡êo¨°???¨®?¨®¨²?????¦Ì?¨º¦Ì??????¨ª?¡¥¨¢D¡ê?¨°???¨®?¨®¨²??¨º????¡ã?¨´???¦Ì?¨º¦Ì??2¨¬???¡Á???¨®¨°¡ê?¨°??¡ã¨°???¡À¨º???a?¡ãTurn On?¡À¦Ì?¡ã¡ä?£¤?¡ê¡ã¡ä??¡ä?¡ã¡ä?£¤o¨®¡ê??¨²??¡ä¨®¨¢??¨¢¨¦¨´?¡§¦Ì?¨¤?¨°??¡Â?D¨¬y¦Ì??y?¨°2¡§¦Ì?¨¦¨´¨°?¡ê?¨ª?¨º¡À¡ã¡ä?£¤¨¦?¦Ì???¡Á???¡À?3¨¦?¡ãTurn Off?¡À?¡ê¨®??¨¹?¨¬?¨°??¨º¨®¡À¨º¨°??¡¥?¨ª?¡¥¨¢D?¨¦¨°???¡À??¦Ì?¨º?¡ê¨°a1?¡À?¨¦¨´¨°?¡ê??¨¦¨°??¨´¡ä?¡ã¡ä??¡ã¡ä?£¤?¡ê

SINEWAVE3¨¬D¨°¡ä¨²??3?¨º??¡¥?¨ª?¡¥¨¢D¡ê?¨°?¡À??¦Ì?¨º?¨²WM_INITDIALOG???¡é¡ä|¨¤¨ª?¨²??¡Á?¦Ì¨ª¨º?20Hz¡ê?¡Á???¨º?5000Hz?¡ê3?¨º??¡¥¨º¡À¡ê??¨ª?¡¥¨¢D¨¦¨¨?¡§?a440 Hz?¡ê¨®?¨°?¨¤?¨º?¨®?¨¤¡ä?¦Ì?¨ª¨º??D¨°?¨¦???¦Ì?A¡ê??¨¹?¨²1¨¹?¨°¨¤??¨®?Y¡Á¨¤¨º¡À¨®?¨¤¡ä¦Ì¡Â¨°??¡êDlgProc?¨²?¨®¨º?WM_HSCROLL???¡é¡ä|¨¤¨ª?¨²????¡À??2¨¬?¡À?¨¢?iFreq?¡ê¡Á¡é¨°a¡ê?Page Lefto¨ªPage Right??¦Ì???DlgProc???¨®?¨°????¨¦¨´¨°???¡ã??¨¨¨°??¡Á?¡ê

¦Ì¡ÀDlgProc¡ä¨®¡ã¡ä?£¤¨º?¦Ì?¨°???WM_COMMAND???¡é¨º¡À¡ê??¨¹¨º¡Á?¨¨????4???¨²¡ä??¨¦?a?a2??¨®?¨®¨²WAVEHDR?¨¢11¡ê??¨°???¨ª¨¦?¨¬????¡ê¨¢¨ª¨¢???¨®?¨®¨²?o3???¡ä¡é¡ä?2¡§D?¨ºy?Y¡ê??¨°?????a¨¢????o3???3??apBuffer1o¨ªpBuffer2?¡ê

¨ª¡§1y¦Ì¡Â¨®?waveOutOpeno¡¥¨ºy¡ê?SINEWAVE¡ä¨°?a2¡§D?¨¦¨´¨°?¨¦¨¨¡À?¨°?¡À?¨º?3?¡ê?waveOutOpeno¡¥¨ºy¨º1¨®?????¦Ì?2?¨ºy¡êo

waveOutOpen (&hWaveOut, wDeviceID, &waveformat, dwCallBack,
             				dwCallBackData, dwFlags) ;

??¦Ì¨²¨°???2?¨ºy¨¦¨¨?¡§?a???¨°HWAVEOUT¡ê¡§handle to waveform audio output¡êo2¡§D?¨¦¨´¨°?¨º?3?¡ä¨²o?¡ê?D¨ª¨¬?¦Ì?¡À?¨¢??¡ê¡ä¨®o¡¥¨ºy¡ä???¨º¡À¡ê?¡ä?¡À?¨¢???¨¦¨¨?¡§?a¨°???¡ä¨²o?¡ê?o¨®??¦Ì?2¡§D?¨º?3?¦Ì¡Â¨®??D??¨º1¨®???¡ä¨²o??¡ê

waveOutOpen¦Ì?¦Ì¨²?t??2?¨ºy¨º?¨¦¨¨¡À?ID?¡ê?¨¹?¨ºD¨ªo¡¥¨ºy?¨¦¨°??¨²¡ã2¡Á¡ã?¨¤??¨¦¨´?¡§¦Ì??¨²?¡Â¨¦?¨º1¨®??¡ê2?¨ºy¦Ì?¡¤??¡ì?¨²0¦Ì??¦Ì¨ª3?¨´¡ã2¡Á¡ã¦Ì?2¡§D?¨º?3?¨¦¨¨¡À?¨ºy?????¡ê¦Ì¡Â¨®?waveOutGetNumDevs?¨¦¨°???¦Ì?2¡§D?¨º?3?¨¦¨¨¡À?¨ºy¡ê???¦Ì¡Â¨®?waveOutGetDevCaps?¨¦¨°??¨°3?????2¡§D?¨º?3?¨¦¨¨¡À??¡ê¨¨?1?????3y¨¦¨¨¡À??¨ºo?¡ê????¡ä?¨²?¨¦¨°?¨®?3¡ê¨ºyWAVE_MAPPER¡ê¡§?¡§¨°??a-1¡ê?¨¤¡ä????¨¦¨¨¡À?¡ê???¨¦¨¨¡À??¨²?¡ã????¨¬¡§?¡À¦Ì??¡ã?¨¤??¨¬??¡À?D?¡ã¨°?D¡ì?¡À¨°3???¨ª¡À¨º¨¤?¦Ì??¡ã?2??¨º1¨®?¦Ì?¨¦¨¨¡À??¡À?D???¡§?¡ê¨¢¨ª¨ªa¡ê?¨¨?1?¨º¡Á??¨¦¨¨¡À?2??¨¹?¨²¡Á??¨²¦Ì?D¨¨¨°a¡ê??????¨¹¨¦¨¨¡À??¨¦¨°?¡ê????¡ä?¦Ì¨ª3?????????¨¹¨¦¨¨¡À??¡ê

¦Ì¨²¨¨y??2?¨ºy¨º????¨°WAVEFORMATEX?¨¢11¦Ì?????¡ê¡§o¨®?????¨º???¨¦¨¦¨¹¡ê??¡ê¦Ì¨²????2?¨ºy¨º?¡ä¡ã?¨²¡ä¨²o??¨°???¨°?¡¥¨¬?¨¢¡ä?¨®?a?Dcallbacko¡¥¨ºy¦Ì???¡À¨º¡ê?¨®?¨¤¡ä¡À¨ª¨º??¨®¨º?2¡§D?¨º?3????¡é¦Ì?¡ä¡ã?¨²?¨°??callbacko¡¥¨ºy?¡ê¨º1¨®?callbacko¡¥¨ºy¨º¡À¡ê??¨¦?¨²¦Ì¨²????2?¨ºy?D???¡§3¨¬D¨°?¡§¨°?¦Ì?¨ºy?Y?¡êdwFlags2?¨ºy?¨¦¨¦¨¨?aCALLBACK_WINDOW?¨°CALLBACK_FUNCTION¡ê?¨°?¡À¨ª¨º?¦Ì¨²????2?¨ºy¦Ì?D¨ª¨¬??¡ê?¨²¨°2?¨¦¨®?WAVE_FORMAT_QUERY¡À¨º??¨¤¡ä?¨¬2¨¦?¨¹¡¤?¡ä¨°?a¨¦¨¨¡À?¡ê¡§¨º¦Ì?¨º¨¦?2¡é2?¡ä¨°?a?¨¹¡ê??¡ê?1¨®D???¨¹????¡À¨º???¨¦¨®??¡ê

waveOutOpen¦Ì?¦Ì¨²¨¨y??2?¨ºy?¡§¨°??a???¨°WAVEFORMATEXD¨ª¨¬??¨¢11¦Ì?????¡ê?¡ä??¨¢11?¨²MMSYSTEM.H?D?¡§¨°?¨¨???¡êo

typedef struct waveformat_tag
{
     	WORD  	wFormatTag ;             // waveform format = WAVE_FORMAT_PCM
     	WORD  	nChannels ;         		// number of channels = 1 or 2
     	DWORD 	nSamplesPerSec ;    		// sample rate
     	DWORD 	nAvgBytesPerSec ; 	    // bytes per second
     	WORD  	nBlockAlign ;       		// block alignment
     	WORD  	wBitsPerSample ;    		// bits per samples = 8 or 16
     	WORD  	cbSize ;            		// 0 for PCM
}
WAVEFORMATEX, * PWAVEFORMATEX ;

?¨²?¨¦¨®?¡ä??¨¢11???¡§¨¨??¨´?¦Ì?¨º¡ê¡§nSamplesPerSec¡ê?o¨ª¨¨??¨´??¨¨¡¤?¨¨¡ê¡§nBitsPerSample¡ê?¡ê?¨°??¡ã????¦Ì£¤¨¦¨´¦Ì¨¤?¨°¨¢¡é¨¬?¨¦¨´¡ê¡§nChannels¡ê??¡ê?¨¢11?D¨®DD?D??¡é?¡ä?e¨¤¡ä¨º??¨¤¨®¨¤¦Ì?¡ê?¦Ì????¨¢11¨°2?¨¦¨®?¨®¨²¡¤?PCM¦Ì?¨¨??¨´¡¤?¨º??¡ê?¨²¡¤?PCM¨¨??¨´¡¤?¨º???¡ê?¡ä??¨¢11¦Ì?¡Á?o¨®¨°???¡Á???¨¦¨¨?¡§?a¡¤?0?¦Ì¡ê?2¡é¡ä?¨®D???¨¹D??¡é?¡ê

??¨®¨²PCM¨¨??¨´¡¤?¨º?¡ê?nBlockAlign¡Á???¨¦¨¨?¡§?anChannels3?¨°?wBitsPerSample?¨´3y¨°?8?¨´¦Ì?¦Ì?¦Ì?¨ºy?¦Ì¡ê??¨¹¡À¨ª¨º???¡ä?¨¨??¨´¦Ì?¡Á¨¹¡Á??¨²¨ºy?¡ênAvgBytesPerSec¡Á???¨¦¨¨?¡§?anSamplesPerSeco¨ªnBlockAlign¦Ì?3??y?¡ê

SINEWAVE3?¨º??¡¥WAVEFORMATEX?¨¢11¦Ì?¡Á???¡ê?2¡é¦Ì¡Â¨®?waveOutOpeno¡¥¨ºy¡êo

waveOutOpen (	&hWaveOut, WAVE_MAPPER, &waveformat,
             	 (DWORD) hwnd, 0, CALLBACK_WINDOW)

¨¨?1?¦Ì¡Â¨®?3¨¦1|¡ê??¨°waveOutOpeno¡¥¨ºy¡ä???MMSYSERR_NOERROR¡ê¡§?¡§¨°??a0¡ê?¡ê?¡¤??¨°¡ä???¡¤?0¦Ì?¡ä¨ª?¨®¡ä¨²???¡ê¨¨?1?waveOutOpen¦Ì?¡ä????¦Ì¡¤?0¡ê??¨°SINEWAVE??3y¡ä¡ã?¨²¡ê?2¡é??¨º?¨°???¡À¨º¨º?¡ä¨ª?¨®¦Ì????¡é?¨°?¡ê

???¨²¨¦¨¨¡À?¡ä¨°?a¨¢?¡ê?SINEWAVE?¨¬D?3?¨º??¡¥¨¢???WAVEHDR?¨¢11¦Ì?¡Á???¡ê??a¨¢????¨¢11¨®?¨®¨²?¨²API?D¡ä?¦ÌY?o3??¡êWAVEHDR?¡§¨°?¨¨???¡êo

typedef struct wavehdr_tag
{
    	LPSTR lpData;                    				// pointer to data buffer
	    DWORD dwBufferLength;            				// length of data buffer
    	DWORD dwBytesRecorded;      				 	// used for recorded
    	DWORD dwUser;                    				// for program use
    	DWORD dwFlags;                   				// flags
    	DWORD dwLoops;                   				// number of repetitions
    	struct wavehdr_tag FAR *lpNext;  		        // reserved
    	DWORD reserved;                  				// reserved
}
WAVEHDR, *PWAVEHDR ;

SINEWAVE??lpData¡Á???¨¦¨¨?¡§?a¡ã¨¹o?¨ºy?Y¦Ì??o3???¦Ì??¡¤¡ê?dwBufferLength¡Á???¨¦¨¨?¡§?a¡ä??o3???¦Ì?¡ä¨®D?¡ê?dwLoops¡Á???¨¦¨¨?¡§?a1¡ê????¨¹¡Á?????¨¦¨¨?¡§?a0?¨°NULL?¡ê¨¨?1?¨°a???¡ä?-?¡¤2£¤¡¤?¨¦¨´¨°?¡ê??¨¦¨¦¨¨?¡§dwFlagso¨ªdwLoops¡Á????¡ê

SINEWAVE??¨°?2??a¨¢???D??¡é¡À¨ª¨ª¡¤¦Ì¡Â¨®?waveOutPrepareHeadero¡¥¨ºy¡ê?¨°?¡¤¨¤?1?¨¢11o¨ª?o3???¨®?¡ä??¨¬¡¤¡é¨¦¨²¨ºy?Y?????¡ê

¦Ì?¡ä??a?1¡ê??¨´¨®D¦Ì??aD?¡Á?¡À???¨º??¨¬¨®|¦Ì£¤?¡Â¡ä¨°?a¨¦¨´¨°?¦Ì?¡ã¡ä?£¤?¡ê¦Ì??¨²3¨¬D¨°¦Ì????¡é?¨®¨¢D¨¤?¨°??-¨®D¨°??????¡é?¨²¦Ì¨¨¡äy?¨¬¨®|?¡ê¨°¨°?a?¨°??¨°??-?¨²o¡¥¨ºywaveOutOpen?D???¡§¨°a¨®?¨°???¡ä¡ã?¨²???¡é¡ä|¨¤¨ª3¨¬D¨°¨¤¡ä?¨®¨º?2¡§D?¨º?3????¡é¡ê??¨´¨°?waveOutOpeno¡¥¨ºy?¨°3¨¬D¨°¦Ì????¡é?¨®¨¢D¡¤¡é?¨ª¨¢?MM_WOM_OPEN???¡é¡ê?wParam???¡é2?¨ºy¨¦¨¨?¡§?a2¡§D?¨º?3?¡ä¨²o??¡ê¨°a¡ä|¨¤¨ªMM_WOM_OPEN???¡é¡ê?SINEWAVE¦Ì¡Â¨®?FillBuffero¡¥¨ºy¨¢?¡ä?¡ê?2¡é¨®??y?¨°2¡§D?¨ºy?Y¨¬?3?pBuffer?o3????¡ê¨¨?o¨®SINEWAVE¡ã?¨¢???WAVEHDR?¨¢11¡ä??¨ª??waveOutWrite¡ê?¡ä?o¡¥¨ºy??¨ºy?Y¡ä??¨ª¦Ì?2¡§D?¨º?3?¨®2?t¡ê?2????y?a¨º?2£¤¡¤?¨¦¨´¨°??¡ê

¦Ì¡À2¡§D?¨®2?t2£¤¡¤?¨ª¨ºwaveOutWriteo¡¥¨ºy¡ä??¨ª¨¤¡ä¦Ì?¨ºy?Yo¨®¡ê??¨ª?¨°¡ä¡ã?¨²¡¤¡é?¨ªMM_WOM_DONE???¡é¡ê????DwParam2?¨ºy¨º?2¡§D?¨º?3?¡ä¨²o?¡ê?lParam¨º????¨°WAVEHDR?¨¢11¦Ì??????¡êSINEWAVE?¨²¡ä|¨¤¨ª¡ä????¡é¨º¡À¡ê????????o3???¦Ì?D?¨ºy?Y¡ê?2¡é¦Ì¡Â¨®?waveOutWrite¨¤¡ä??D?¨¬¨¢???o3????¡ê

¡À¨¤D¡äSINEWAVE3¨¬D¨°¨º¡À¨°2?¨¦¨°???¨®?¨°???WAVEHDR?¨¢11o¨ª¨°????o3????¡ê2?1y¡ê??a?¨´?¨²2£¤¡¤?¨ª¨º¨ºy?Yo¨®???¨¢¨®Do¨¹?¨¬?Y¦Ì?¨ª¡ê?¨´¡ê?¨°?¦Ì¨¨¡äy3¨¬D¨°¡ä|¨¤¨ªMM_WOM_DONE???¡é¨¤¡ä¨¬¨¢??D?¦Ì??o3????¡êSINEWAVE¨º1¨®?¦Ì??¡ã???o3??¡À??¨º?¡À¨¹?a¨¢?¨¦¨´¨°?¦Ì?2?¨¢?D??¡ê

¦Ì¡À¨º1¨®???¦Ì£¤?¡Â?¡ãTurn Off?¡À¡ã¡ä?£¤1?¡À?¨¦¨´¨°?¨º¡À¡ê?DlgProc?¨®¨º?¦Ì?¨¢¨ª¨°???WM_COMMAND???¡é?¡ê??¡ä????¡é¡ê?DlgProc¡ã?bShutOff¡À?¨¢?¨¦¨¨?¡§?aTRUE¡ê?2¡é¦Ì¡Â¨®?waveOutReseto¡¥¨ºy?¡ê¡ä?o¡¥¨ºy¨ª¡ê?1¡ä|¨¤¨ª¨¦¨´¨°?2¡é¡¤¡é?¨ª¨°?¨¬?MM_WOM_DONE???¡é?¡êbShutOff?aTRUE¨º¡À¡ê?SINEWAVE¨ª?1y¦Ì¡Â¨®?waveOutClose¨¤¡ä¡ä|¨¤¨ªMM_WOM_DONE¡ê?¡ä¨®??2¨²¨¦¨²¨°?¨¬?MM_WOM_CLOSE???¡é?¡ê¡ä|¨¤¨ªMM_WOM_CLOSE¨ª¡§3¡ê¡ã¨¹¨¤¡§??3y3¨¬D¨°?¡êSINEWAVE?a¨¢???WAVEHDR?¨¢11??¦Ì¡Â¨®?waveOutUnprepareHeader?¡é¨º¨ª¡¤??¨´¨®D¦Ì??¨²¡ä??¨¦2¡é¡ã?¡ã¡ä?£¤¨¦?¦Ì???¡Á??????¡ãTurn On?¡À?¡ê

¨¨?1?¨®2?t?¨¬D?2£¤¡¤??o3???¦Ì?¨¦¨´¨°?¨ºy?Y¡ê????¡ä?¨¹¡Á??o¦Ì¡Â¨®?waveOutClose?¨ª??¨®D¡Á¡Â¨®??¡ê?¨²¡À?D??¨¨¦Ì¡Â¨®?waveOutReset¨¤¡ä¨ª¡ê?12£¤¡¤?2¡é2¨²¨¦¨²MM_WOM_DONE???¡é?¡ê¦Ì¡ÀwParam¨º?SC_CLOSE¨º¡À¡ê?DlgProc¨°2¡ä|¨¤¨ªWM_SYSCOMMAND???¡é¡ê??a¨º?¨°¨°?a¨º1¨®???¡ä¨®?¦Ì¨ª32?¦Ì£¤?D????¨¢??¡ãClose?¡À?¡ê¨¨?1?2¡§D?¨¦¨´¨°??¨¬D?2£¤¡¤?¡ê?DlgProc?¨°¦Ì¡Â¨®?waveOutReset?¡ê?T??¨¨?o?¡ê?¡Á?o¨®¡Á¨¹¨°a¦Ì¡Â¨®?EndDialog¨¤¡ä?¨¢¨º?3¨¬D¨°?¡ê

¨ºy¡Á???¨°??¨²

Windows¨¬¨¢1?¨¢?¨°???3??a?¡ã??¨°?3¨¬D¨°?¡À¨¤¡ä????o¨ª2£¤¡¤?¨ºy¡Á?¨¦¨´¨°??¡ê3¨¬D¨°22-3?¨´¨º?¦Ì?3¨¬D¨°¡ê¡§RECORD1¡ê?2?¨¨??¡ã??¨°?3¨¬D¨°?¡À¨ª¨º¨¦?¡ê?¨°¨°?a?¨¹2?o?¨®D¨¨?o????tI/O¡ê?¨°22??¨ºD¨ª¨¦¨´¨°?¡À¨¤?-?¡ê¨¨???¡ê??a??3¨¬D¨°??¨º?¨¢?¨º1¨®?¦Ì¨ª?¡Á2¡§D?¨¦¨´¨°?API¨¤¡ä????o¨ª??¡¤?¨¦¨´¨°?¦Ì??¨´¡À?¡¤?¡¤¡§?¡ê

 3¨¬D¨°22-3  RECORD1
RECORD1.C /*--------------------------------------------------------------------------- RECORD1.C -- Waveform Audio Recorder (c) Charles Petzold, 1998 ----------------------------------------------------------------------------*/ #include <windows.h> #include "resource.h" #define INP_BUFFER_SIZE 16384 BOOL CALLBACK DlgProc (HWND, UINT, WPARAM, LPARAM) ; TCHAR szAppName [] = TEXT ("Record1") ; int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { if (-1 == DialogBox (hInstance, TEXT ("Record"), NULL, DlgProc)) { MessageBox ( NULL, TEXT ("This program requires Windows NT!"), szAppName, MB_ICONERROR) ; } return 0 ; } void ReverseMemory (BYTE * pBuffer, int iLength) { BYTE b ; int i ; for (i = 0 ; i < iLength / 2 ; i++) { b = pBuffer [i] ; pBuffer [i] = pBuffer [iLength - i - 1] ; pBuffer [iLength - i - 1] = b ; } } BOOL CALLBACK DlgProc ( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { static BOOL bRecording, bPlaying, bReverse, bPaused, bEnding, bTerminating ; static DWORD dwDataLength, dwRepetitions = 1 ; static HWAVEIN hWaveIn ; static HWAVEOUT hWaveOut ; static PBYTE pBuffer1, pBuffer2, pSaveBuffer, pNewBuffer ; static PWAVEHDR pWaveHdr1, pWaveHdr2 ; static TCHAR szOpenError[] = TEXT ("Error opening waveform audio!"); static TCHAR szMemError [] = TEXT ("Error allocating memory!") ; static WAVEFORMATEX waveform ; switch (message) { case WM_INITDIALOG: // Allocate memory for wave header pWaveHdr1 = malloc (sizeof (WAVEHDR)) ; pWaveHdr2 = malloc (sizeof (WAVEHDR)) ; // Allocate memory for save buffer pSaveBuffer = malloc (1) ; return TRUE ; case WM_COMMAND: switch (LOWORD (wParam)) { case IDC_RECORD_BEG: // Allocate buffer memory pBuffer1 = malloc (INP_BUFFER_SIZE) ; pBuffer2 = malloc (INP_BUFFER_SIZE) ; if (!pBuffer1 || !pBuffer2) { if (pBuffer1) free (pBuffer1) ; if (pBuffer2) free (pBuffer2) ; MessageBeep (MB_ICONEXCLAMATION) ; MessageBox (hwnd, szMemError, szAppName, MB_ICONEXCLAMATION | MB_OK) ; return TRUE ; } // Open waveform audio for input waveform.wFormatTag = WAVE_FORMAT_PCM ; waveform.nChannels = 1 ; waveform.nSamplesPerSec = 11025 ; waveform.nAvgBytesPerSec = 11025 ; waveform.nBlockAlign = 1 ; waveform.wBitsPerSample = 8 ; waveform.cbSize = 0 ; if (waveInOpen (&hWaveIn, WAVE_MAPPER, &waveform, (DWORD) hwnd, 0, CALLBACK_WINDOW)) { free (pBuffer1) ; free (pBuffer2) ; MessageBeep (MB_ICONEXCLAMATION) ; MessageBox (hwnd, szOpenError, szAppName, MB_ICONEXCLAMATION | MB_OK) ; } // Set up headers and prepare them pWaveHdr1->lpData = pBuffer1 ; pWaveHdr1->dwBufferLength = INP_BUFFER_SIZE ; pWaveHdr1->dwBytesRecorded = 0 ; pWaveHdr1->dwUser = 0 ; pWaveHdr1->dwFlags = 0 ; pWaveHdr1->dwLoops = 1 ; pWaveHdr1->lpNext = NULL ; pWaveHdr1->reserved = 0 ; waveInPrepareHeader (hWaveIn, pWaveHdr1, sizeof (WAVEHDR)) ; pWaveHdr2->lpData = pBuffer2 ; pWaveHdr2->dwBufferLength = INP_BUFFER_SIZE ; pWaveHdr2->dwBytesRecorded = 0 ; pWaveHdr2->dwUser = 0 ; pWaveHdr2->dwFlags = 0 ; pWaveHdr2->dwLoops = 1 ; pWaveHdr2->lpNext = NULL ; pWaveHdr2->reserved = 0 ; waveInPrepareHeader (hWaveIn, pWaveHdr2, sizeof (WAVEHDR)) ; return TRUE ; case IDC_RECORD_END: // Reset input to return last buffer bEnding = TRUE ; waveInReset (hWaveIn) ; return TRUE ; case IDC_PLAY_BEG: // Open waveform audio for output waveform.wFormatTag = WAVE_FORMAT_PCM ; waveform.nChannels = 1 ; waveform.nSamplesPerSec = 11025 ; waveform.nAvgBytesPerSec = 11025 ; waveform.nBlockAlign = 1 ; waveform.wBitsPerSample = 8 ; waveform.cbSize = 0 ; if (waveOutOpen (&hWaveOut, WAVE_MAPPER, &waveform, (DWORD) hwnd, 0, CALLBACK_WINDOW)) { MessageBeep (MB_ICONEXCLAMATION) ; MessageBox (hwnd, szOpenError, szAppName, MB_ICONEXCLAMATION | MB_OK) ; } return TRUE ; case IDC_PLAY_PAUSE: // Pause or restart output if (!bPaused) { waveOutPause (hWaveOut) ; SetDlgItemText (hwnd, IDC_PLAY_PAUSE, TEXT ("Resume")) ; bPaused = TRUE ; } else { waveOutRestart (hWaveOut) ; SetDlgItemText (hwnd, IDC_PLAY_PAUSE, TEXT ("Pause")) ; bPaused = FALSE ; } return TRUE ; case IDC_PLAY_END: // Reset output for close preparation bEnding = TRUE ; waveOutReset (hWaveOut) ; return TRUE ; case IDC_PLAY_REV: // Reverse save buffer and play bReverse = TRUE ; ReverseMemory (pSaveBuffer, dwDataLength) ; SendMessage (hwnd, WM_COMMAND, IDC_PLAY_BEG, 0) ; return TRUE ; case IDC_PLAY_REP: // Set infinite repetitions and play dwRepetitions = -1 ; SendMessage (hwnd, WM_COMMAND, IDC_PLAY_BEG, 0) ; return TRUE ; case IDC_PLAY_SPEED: // Open waveform audio for fast output waveform.wFormatTag = WAVE_FORMAT_PCM ; waveform.nChannels = 1 ; waveform.nSamplesPerSec =22050 ; waveform.nAvgBytesPerSec= 22050 ; waveform.nBlockAlign = 1 ; waveform.wBitsPerSample = 8 ; waveform.cbSize = 0 ; if (waveOutOpen (&hWaveOut, 0, &waveform, (DWORD) hwnd, 0, CALLBACK_WINDOW)) { essageBeep (MB_ICONEXCLAMATION) ; MessageBox (hwnd, szOpenError, szAppName, MB_ICONEXCLAMATION | MB_OK) ; } return TRUE ; } break ; case MM_WIM_OPEN: // Shrink down the save buffer pSaveBuffer = realloc (pSaveBuffer, 1) ; // Enable and disable buttons EnableWindow (GetDlgItem (hwnd, IDC_RECORD_BEG), FALSE) ; EnableWindow (GetDlgItem (hwnd, IDC_RECORD_END), TRUE) ; EnableWindow (GetDlgItem (hwnd, IDC_PLAY_BEG), FALSE) ; EnableWindow (GetDlgItem (hwnd, IDC_PLAY_PAUSE), FALSE) ; EnableWindow (GetDlgItem (hwnd, IDC_PLAY_END), FALSE) ; EnableWindow (GetDlgItem (hwnd, IDC_PLAY_REV), FALSE) ; EnableWindow (GetDlgItem (hwnd, IDC_PLAY_REP), FALSE) ; EnableWindow (GetDlgItem (hwnd, IDC_PLAY_SPEED), FALSE) ; SetFocus (GetDlgItem (hwnd, IDC_RECORD_END)) ; // Add the buffers waveInAddBuffer (hWaveIn, pWaveHdr1, sizeof (WAVEHDR)) ; waveInAddBuffer (hWaveIn, pWaveHdr2, sizeof (WAVEHDR)) ; // Begin sampling bRecording = TRUE ; bEnding = FALSE ; dwDataLength = 0 ; waveInStart (hWaveIn) ; return TRUE ; case MM_WIM_DATA: // Reallocate save buffer memory pNewBuffer = realloc ( pSaveBuffer, dwDataLength + ((PWAVEHDR) lParam)->dwBytesRecorded) ; if (pNewBuffer == NULL) { waveInClose (hWaveIn) ; MessageBeep (MB_ICONEXCLAMATION) ; MessageBox (hwnd, szMemError, szAppName, MB_ICONEXCLAMATION | MB_OK) ; return TRUE ; } pSaveBuffer = pNewBuffer ; CopyMemory (pSaveBuffer + dwDataLength, ((PWAVEHDR) lParam)->lpData, ((PWAVEHDR) lParam)->dwBytesRecorded) ; dwDataLength += ((PWAVEHDR) lParam)->dwBytesRecorded ; if (bEnding) { waveInClose (hWaveIn) ; return TRUE ; } // Send out a new buffer waveInAddBuffer (hWaveIn, (PWAVEHDR) lParam, sizeof (WAVEHDR)) ; return TRUE ; case MM_WIM_CLOSE: // Free the buffer memory waveInUnprepareHeader (hWaveIn, pWaveHdr1, sizeof (WAVEHDR)) ; waveInUnprepareHeader (hWaveIn, pWaveHdr2, sizeof (WAVEHDR)) ; free (pBuffer1) ; free (pBuffer2) ; // Enable and disable buttons EnableWindow (GetDlgItem (hwnd, IDC_RECORD_BEG), TRUE) ; EnableWindow (GetDlgItem (hwnd, IDC_RECORD_END), FALSE) ; SetFocus (GetDlgItem (hwnd, IDC_RECORD_BEG)) ; if (dwDataLength > 0) { EnableWindow (GetDlgItem (hwnd, IDC_PLAY_BEG), TRUE) ; EnableWindow (GetDlgItem (hwnd, IDC_PLAY_PAUSE), FALSE) ; EnableWindow (GetDlgItem (hwnd, IDC_PLAY_END), FALSE) ; EnableWindow (GetDlgItem (hwnd, IDC_PLAY_REP), TRUE) ; EnableWindow (GetDlgItem (hwnd, IDC_PLAY_REV), TRUE) ; EnableWindow (GetDlgItem (hwnd, IDC_PLAY_SPEED), TRUE) ; SetFocus (GetDlgItem (hwnd, IDC_PLAY_BEG)) ; } bRecording = FALSE ; if (bTerminating) SendMessage (hwnd, WM_SYSCOMMAND, SC_CLOSE, 0L) ; return TRUE ; case MM_WOM_OPEN: // Enable and disable buttons EnableWindow (GetDlgItem (hwnd, IDC_RECORD_BEG), FALSE) ; EnableWindow (GetDlgItem (hwnd, IDC_RECORD_END), FALSE) ; EnableWindow (GetDlgItem (hwnd, IDC_PLAY_BEG), FALSE) ; EnableWindow (GetDlgItem (hwnd, IDC_PLAY_PAUSE), TRUE); EnableWindow (GetDlgItem (hwnd, IDC_PLAY_END), TRUE); EnableWindow (GetDlgItem (hwnd, IDC_PLAY_REP), FALSE) ; EnableWindow (GetDlgItem (hwnd, IDC_PLAY_REV), FALSE) ; EnableWindow (GetDlgItem (hwnd, IDC_PLAY_SPEED), FALSE) ; SetFocus (GetDlgItem (hwnd, IDC_PLAY_END)) ; // Set up header pWaveHdr1->lpData = pSaveBuffer ; pWaveHdr1->dwBufferLength = dwDataLength ; pWaveHdr1->dwBytesRecorded = 0 ; pWaveHdr1->dwUser = 0 ; pWaveHdr1->dwFlags = WHDR_BEGINLOOP | WHDR_ENDLOOP ; pWaveHdr1->dwLoops = dwRepetitions ; pWaveHdr1->lpNext = NULL ; pWaveHdr1->reserved = 0 ; // Prepare and write waveOutPrepareHeader (hWaveOut, pWaveHdr1, sizeof (WAVEHDR)) ; waveOutWrite (hWaveOut, pWaveHdr1, sizeof (WAVEHDR)) ; bEnding = FALSE ; bPlaying = TRUE ; return TRUE ; case MM_WOM_DONE: waveOutUnprepareHeader (hWaveOut, pWaveHdr1, sizeof (WAVEHDR)) ; waveOutClose (hWaveOut) ; return TRUE ; case MM_WOM_CLOSE: // Enable and disable buttons EnableWindow (GetDlgItem (hwnd, IDC_RECORD_BEG), TRUE) ; EnableWindow (GetDlgItem (hwnd, IDC_RECORD_END), TRUE) ; EnableWindow (GetDlgItem (hwnd, IDC_PLAY_BEG), TRUE) ; EnableWindow (GetDlgItem (hwnd, IDC_PLAY_PAUSE), FALSE) ; EnableWindow (GetDlgItem (hwnd, IDC_PLAY_END), FALSE) ; EnableWindow (GetDlgItem (hwnd, IDC_PLAY_REV), TRUE) ; EnableWindow (GetDlgItem (hwnd, IDC_PLAY_REP), TRUE) ; EnableWindow (GetDlgItem (hwnd, IDC_PLAY_SPEED), TRUE) ; SetFocus (GetDlgItem (hwnd, IDC_PLAY_BEG)) ; SetDlgItemText (hwnd, IDC_PLAY_PAUSE, TEXT ("Pause")) ; bPaused = FALSE ; dwRepetitions = 1 ; bPlaying = FALSE ; if (bReverse) { ReverseMemory (pSaveBuffer, dwDataLength) ; bReverse = FALSE ; } if (bTerminating) SendMessage (hwnd, WM_SYSCOMMAND, SC_CLOSE, 0L) ; return TRUE ; case WM_SYSCOMMAND: switch (LOWORD (wParam)) { case SC_CLOSE: if (bRecording) { bTerminating = TRUE ; bEnding = TRUE ; waveInReset (hWaveIn) ; return TRUE ; } if (bPlaying) { bTerminating = TRUE ; bEnding = TRUE ; waveOutReset (hWaveOut) ; return TRUE ; } free (pWaveHdr1) ; free (pWaveHdr2) ; free (pSaveBuffer) ; EndDialog (hwnd, 0) ; return TRUE ; } break ; } return FALSE ; }
 RECORD.RC ¡ê¡§?a??¡ê?
//Microsoft Developer Studio generated resource script. #include "resource.h" #include "afxres.h" ///////////////////////////////////////////////////////////////////////////// // Dialog RECORD DIALOG DISCARDABLE 100, 100, 152, 74 STYLE WS_MINIMIZEBOX | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "Waveform Audio Recorder" FONT 8, "MS Sans Serif" BEGIN PUSHBUTTON "Record",IDC_RECORD_BEG,28,8,40,14 PUSHBUTTON "End",IDC_RECORD_END,76,8,40,14,WS_DISABLED PUSHBUTTON "Play",IDC_PLAY_BEG,8,30,40,14,WS_DISABLED PUSHBUTTON "Pause",IDC_PLAY_PAUSE,56,30,40,14,WS_DISABLED PUSHBUTTON "End",IDC_PLAY_END,104,30,40,14,WS_DISABLED PUSHBUTTON "Reverse",IDC_PLAY_REV,8,52,40,14,WS_DISABLED PUSHBUTTON "Repeat",IDC_PLAY_REP,56,52,40,14,WS_DISABLED PUSHBUTTON "Speedup",IDC_PLAY_SPEED,104,52,40,14,WS_DISABLED END
 RESOURCE.H ¡ê¡§?a??¡ê?
// Microsoft Developer Studio generated include file. // Used by Record.rc #define IDC_RECORD_BEG 1000 #define IDC_RECORD_END 1001 #define IDC_PLAY_BEG 1002 #define IDC_PLAY_PAUSE 1003 #define IDC_PLAY_END 1004 #define IDC_PLAY_REV 1005 #define IDC_PLAY_REP 1006 #define IDC_PLAY_SPEED 1007

RECORD.RCo¨ªRESOURCE.H???t¨°2?¨²RECORD2o¨ªRECORD33¨¬D¨°?D¨º1¨®??¡ê

RECORD1¡ä¡ã?¨²¨®D8??¡ã¡ä?£¤?¡ê¦Ì¨²¨°?¡ä???DDRECORD1¨º¡À¡ê???¨®D?¡ãRecord?¡À¡ã¡ä?£¤¨®DD¡ì?¡ê¡ã¡ä???¡ãRecord?¡Ào¨®¡ê??¨ª?a¨º???¨°?¡ê??a¨º¡À?¡ãRecord?¡À¡ã¡ä?£¤?TD¡ì¡ê????¡ãEnd?¡À¡ã¡ä?£¤¨®DD¡ì?¡ê¡ã¡ä???¡ãEnd?¡À?¨¦¨ª¡ê?1??¨°??¡ê?a¨º¡À¡ê??¡ãPlay?¡À?¡é?¡ã Reverse?¡À?¡é?¡ã Repeat?¡Ào¨ª?¡ãSpeedup?¡À¨°2??¨®DD¡ì¡ê?????¨¨?¨°???¡ã¡ä?£¤???¨¦??¡¤?¨¦¨´¨°?¡êo?¡ãPlay?¡À¡À¨ª¨º??y3¡ê2£¤¡¤?¡ê??¡ãReverse?¡À¡À¨ª¨º?¡¤¡ä?¨°2£¤¡¤?¡ê??¡ãRepeat?¡À¡À¨ª¨º??T?T¦Ì????¡ä2£¤¡¤?¡ê¡§o????-?¡¤??¨°?¡ä?¡ê?¡ê??¡ãSpeedup?¡À¨°??y3¡ê?¨´?¨¨¦Ì?¨¢?¡À?¨¤¡ä2£¤¡¤??¡ê¨°a¨ª¡ê?12£¤¡¤?¡ê??¨²?¨¦¨°??????¡ãEnd?¡À¡ã¡ä?£¤¡ê???¡ã¡ä???¡ãPause?¡À¡ã¡ä?£¤?¨¦¨ª¡ê?12£¤¡¤??¡ê¡ã¡ä??o¨®¡ê??¡ãPause?¡À¡ã¡ä?£¤??¡À??a?¡ãResume?¡À¡ã¡ä?£¤¡ê?¨®?¨®¨²?¨¬D?2£¤¡¤?¨¦¨´¨°??¡ê¨¨?1?¨°a????¨¢¨ª¨°???¨¦¨´¨°?¡ê?D?????¦Ì?¨¦¨´¨°???¨¬????¨²¡ä?¨¤???¨®D¦Ì?¨¦¨´¨°??¡ê

¨¨?o?¨º¡Ào¨°¡ê?¨®DD¡ì¡ã¡ä?£¤??¨º??¨¦¨°???DD¨®DD¡ì2¨´¡Á¡Â¦Ì?¡ã¡ä?£¤?¡ê?aD¨¨¨°a?¨²RECORD1?¡ä¡ä¨²???D¡ã¨¹¨¤¡§??EnableWindow¦Ì??¨¤¡ä?¦Ì¡Â¨®?¡ê?¦Ì?¨º?3¨¬D¨°2¡é2??¨¬2¨¦??¨¬?¦Ì?¡ã¡ä?£¤2¨´¡Á¡Â¨º?¡¤?¨®DD¡ì?¡ê??¨¨?¡ê??a¨º1¦Ì?3¨¬D¨°2¨´¡Á¡Â?¨¹?a?¡À1??¡ê

RECORD1¨®?¨¢?D¨ª?¨¤?¨¬?Y¡¤?¨º?¨¤¡ä?¨°?¡¥3¨¬D¨°¡ä¨²???¡ê¨º¡Á?¨¨¡ê?¨¨?1?¡ã2¡Á¡ã¨¢??¨¤??2¡§D?¨¦¨´¨°?¨®2¨¦¨¨¡À?¡ê??¨°RECORD1??¨º1¨®??¨²?¡§¨¦¨¨¡À??¡ê??¡ä?¡ê?3¨¬D¨°¡ã¡ä¡À¨º¡Á?¦Ì?11.025 kHz¦Ì?¨¨??¨´?¦Ì?¨ºo¨ª8??¦Ì?¨¨??¨´??¨¨¡¤?¨¨¨¤¡ä??¨°?o¨ª¡¤?¨°?¡ê???2?1¨¹¨¦¨¨¡À??¨¹¡¤?¨¬¨¢1??¨¹??¦Ì?¨¨??¨´?¦Ì?¨ºo¨ª¨¨??¨´??¨¨¡¤?¨¨?¡ê?¡§¨°?¦Ì?¨¤y¨ªa¨º??¨®?¨´1|?¨¹¡ê??¨®?¨´¨º¡ÀRECORD1¡ã¡ä22.050kHz¦Ì?¨¨??¨´?¦Ì?¨º2£¤¡¤?¨¦¨´¨°?¡ê??a?¨´2???2£¤¡¤??¨´?¨¨¨¬¨¢??¨¢?¨°?¡À?¡ê????¨°?¦Ì?¨º¨°2¨¬¨¢??¨¢?¨°???¨°??¡Á?¡ê

????¨¦¨´¨°??¨¨¡ã¨¹¨¤¡§?a¨º?¨¨???¡ä¨°?a2¡§D?¨¦¨´¨°?¨®2?t¡ê??1¡ã¨¹¨¤¡§???o3???¡ä?¦ÌY??API¡ê?¨°?¡À??¨®¨º?¨¦¨´¨°?¨ºy?Y?¡ê

RECORD1¨¦¨¨¨®D?????¨²¡ä??¨¦?¡ê???D¨¨y??o¨¹D?¡ê??¨¢¨¦¨´?¨²3?¨º??¡¥¨º¡Ào¨¹D?¡ê?2¡é?¨°?¨²DlgProc¦Ì?WM_INITDIALOG???¡é¡ä|¨¤¨ª?¨²????DD?????¡ê3¨¬D¨°????¨¢???WAVEHDR?¨¢11¡ê?¡¤?¡Àe¨®¨¦????pWaveHdr1o¨ªpWaveHdr2???¨°?¡ê?a¨¢????¨¢11¨®?¨®¨²???o3???¡ä?¦ÌY??2¡§D?API?¡êpSaveBuffer??¡À¨º???¨°¡ä¡é¡ä???????¨°?¦Ì??o3???¡ê?¡Á?3?????¨º¡À??¨®D¨°???¡Á??¨²?¡ê¨¨?o¨®¡ê???¡Á???¨°?¦Ì???DD¡ê????o3???2?????¡ä¨®¡ê?¨°?¨º¨º¨®|?¨´¨®D¦Ì?¨¦¨´¨°?¨ºy?Y¡ê¡§¨¨?1???¨°?¨º¡À??1y3¡è¡ê??¨°RECORD1?¨¹1??¨²????3¨¬D¨°?D?¡ã¨º¡À¡¤¡é???¨²¡ä?¨°?3?¡ê?2¡é?¨ºD¨ª?¨²??¡¤?3¨¦1|¡ä¡é¡ä?¦Ì?¨¦¨´¨°?¡ê??¡ê¨®¨¦¨®¨²?a???o3???¨®?¨¤¡ä¡ä¡é¡ä????y¦Ì?¨¦¨´¨°?¨ºy?Y¡ê??¨´¨°??¨°????3??a?¡ã¡ä¡é¡ä??o3???¡ê¡§save buffer¡ê??¡À?¡ê??¡À¨ºpBuffer1o¨ªpBuffer2???¨°¦Ì?¨¢¨ª¨ªa¨¢????¨²¡ä??¨¦¡ê?¡ä¨®D?¨º?16K¡ê??¨¹???¨²?????¨®¨º?¦Ì?¨¦¨´¨°?¨ºy?Y¨º¡À?????¡ê??¨°??¨¢¨º?o¨®¨º¨ª¡¤??aD??¨²¡ä??¨¦?¡ê

8??¡ã¡ä?£¤?D¦Ì???¨°??????¨°REPORT1¡ä¡ã?¨²¦Ì????¡ã3¨¬D¨°DlgProc2¨²¨¦¨²WM_COMMAND???¡é?¡ê¡Á?3???¨®D?¡ãRecord?¡À¡ã¡ä?£¤¨®DD¡ì?¡ê¡ã¡ä??¡ä?¡ã¡ä?£¤??2¨²¨¦¨²WM_COMMAND???¡é¡ê????DwParam2?¨ºy¦Ì¨¨¨®¨²IDC_RECORD_BEG?¡ê?a¡ä|¨¤¨ª?a?????¡é¡ê?RECORD1????¨¢???16K¦Ì??o3???¨¤¡ä?¨®¨º?¨¦¨´¨°?¨ºy?Y¡ê?3?¨º??¡¥WAVEFORMATEX?¨¢11¦Ì?¡Á???¡ê?2¡é??¡ä??¨¢11¡ä?¦ÌY??waveInOpeno¡¥¨ºy¡ê?¨¨?o¨®¨¦¨¨?¡§¨¢???WAVEHDR?¨¢11?¡ê

waveInOpeno¡¥¨ºy2¨²¨¦¨²¨°?¨¬?MM_WIM_OPEN???¡é?¡ê?¨²¡ä????¡é¡ä|¨¤¨ª?¨²??¡ê?RECORD1¡ã?¡ä¡é¡ä??o3???¦Ì?¡ä¨®D?????¦Ì?1??¡Á??¨²¡ê?¨°?¡Á?¡À??¨®¨º?¨ºy?Y¡ê¡§¦Ì¡À¨¨?¡ê?¦Ì¨²¨°?¡ä???¨°?¨º¡À¡ê?¡ä¡é¡ä??o3???¦Ì?¡ä¨®D??¨ª¨º?1??¡Á??¨²¡ê?¦Ì?¨°?o¨®????¨º¡À¡ê??¨ª?¨¦?¨¹¡ä¨®?¨¤¨¢?¡ê??¡ê?¨²MM_WIM_OPEN???¡é¡ä|¨¤¨ª?¨²??¡ê?RECORD1¨°2??¨º¨º¦Ì¡À¦Ì?¡ã¡ä?£¤¨¦¨¨?¡§?a¨®DD¡ìo¨ª?TD¡ì?¡ê¨¨?o¨®¡ê?3¨¬D¨°¨®?waveInAddBuffer¡ã?¨¢???WAVEHDR?¨¢11o¨ª?o3???¡ä??¨ª??API?¡ê?a¨º¡À?¨¢¨¦¨¨?¡§?3D?¡À¨º??¡ê?¨¨?o¨®¦Ì¡Â¨®?waveInStart?a¨º???¨°??¡ê

2¨¦¨®?11.025kHz¦Ì?¨¨??¨´?¦Ì?¨ºo¨ª8??¦Ì?¨¨??¨´??¨¨¡¤?¨¨¨º¡À¡ê?16K¦Ì??o3????¨¦¡ä¡é¡ä?¡ä¨®??1.5??¦Ì?¨¦¨´¨°??¡ê?a¨º¡À¡ê?RECORD1?¨®¨º?MM_WIM_DATA???¡é?¡ê?¨²?¨¬¨®|¡ä????¡é¡ä|¨¤¨ª?¨²??¡ê?3¨¬D¨°???¨´?Y¡À?¨¢?dwDataLengtho¨ªWAVEHDR?¨¢11?D¦Ì?¡Á???dwBytesRecorded???o3?????D??????¡ê¨¨?1?????¨º¡ì¡ã¨¹¡ê?RECORD1¦Ì¡Â¨®?waveInClose¨¤¡ä¨ª¡ê?1??¨°??¡ê

¨¨?1???D?????3¨¦1|¡ê??¨°RECORD1¡ã?16K?o3???¨¤?¦Ì?¨ºy?Y?¡ä??¦Ì?¡ä¡é¡ä??o3???¡ê?¨¨?o¨®?¨´¡ä?¦Ì¡Â¨®?waveInAddBuffer?¡ê¡ä?3¨¬D¨°??3?D?¦Ì?RECORD1¨®?¨ª¨º¡ä¡é¡ä??o3???¦Ì??¨²¡ä?¡ê??¨°¨º1¨®???¡ã¡ä???¡ãEnd?¡À¡ã¡ä?£¤?a?1?¡ê

?¡ãEnd?¡À¡ã¡ä?£¤2¨²¨¦¨²WM_COMMAND???¡é¡ê????DwParam¦Ì¨¨¨®¨²IDC_RECORD_END?¡ê¡ä|¨¤¨ª?a?????¡éo¨¹?¨°¦Ì£¤¡ê?RECORD1¡ã?bEnding¡À¨º??¨¦¨¨?¡§?aTRUE2¡é¦Ì¡Â¨®?waveInReset?¡êwaveInReseto¡¥¨ºy¨º1??¨°?¨ª¡ê?1¡ê?2¡é2¨²¨¦¨²MM_WIM_DATA???¡é¡ê??????¡éo?¨®D2?¡¤?¨¬?3?¦Ì??o3????¡ê3y¨¢?¦Ì¡Â¨®?waveInClose¨¤¡ä1?¡À?2¡§D?¨º?¨¨?¨¦¨¨¡À?¨ªa¡ê?RECORD1???a?????¡é?y3¡ê?¨¬¨®|?¡ê

waveInClose2¨²¨¦¨²MM_WIM_CLOSE???¡é?¡êRECORD1?¨¬¨®|¡ä????¡é¨º¡À¡ê?¨º¨ª¡¤?16K¨º?¨¨??o3???¡ê?2¡é¨º1?¨¤¨®|¦Ì?¡ã¡ä?£¤¨®DD¡ì?¨°?TD¡ì?¡ê¨®¨¨??¨º?¡ê?¦Ì¡À¡ä¡é¡ä??o3???¨¤?¡ä?¨®D¨ºy?Y¡ê¡§3y¡¤?¦Ì¨²¨°?¡ä??????¨ª¨º¡ì¡ã¨¹¡ê?¡¤??¨°¨°?¡ã???o?¨®D¨ºy?Y¡ê?¨º¡À¡ê?2£¤¡¤?¡ã¡ä?£¤??¨®DD¡ì?¡ê

??¨°?¨°?o¨®¡ê?¡ä¡é¡ä??o3???¨¤???o?¨®D?aD?¨¦¨´¨°?¨ºy?Y?¡ê¦Ì¡À¨º1¨®????????¡ãPlay?¡À¡ã¡ä?£¤¨º¡À¡ê?DlgProc?¨ª?¨®¨º?¨°???WM_COMMAND???¡é¡ê????DwParam¦Ì¨¨¨®¨²IDC_PLAY_BEG?¡ê?¨¬¨®|¨º¡À¡ê?3¨¬D¨°??3?¨º??¡¥WAVEFORMATEX?¨¢11¦Ì?¡Á???¡ê?2¡é¦Ì¡Â¨®?waveOutOpen?¡ê

waveOutOpen¦Ì¡Â¨®??¨´¡ä?2¨²¨¦¨²MM_WOM_OPEN???¡é¡ê??¨²¡ä????¡é¡ä|¨¤¨ª?¨²??¡ê?RECORD1¡ã??¨¤¨®|¦Ì?¡ã¡ä?£¤¨¦¨¨?a¨®DD¡ì?¨°?TD¡ì¡ê¡§???¨ºD¨ª¨º1¨®??¡ãPause?¡Ào¨ª?¡ãEnd?¡À¡ê?¡ê?¨®?¡ä¡é¡ä??o3???¨¤¡ä3?¨º??¡¥WAVEHDR?¨¢11¦Ì?¡Á???¡ê?¦Ì¡Â¨®?waveOutPrepareHeader¨¤¡ä¡Á?¡À?¨°a2£¤¡¤?¦Ì?¨¦¨´¨°?¡ê?¨¨?o¨®¦Ì¡Â¨®?waveOutWrite?a¨º?2£¤¡¤??¡ê

¨°?¡ã??¨¦????¡ê??¡À¦Ì?2£¤¡¤?¨ª¨º¡ä¡é¡ä??o3???¨¤?¦Ì??¨´¨®D¨ºy?Y2?¨ª¡ê?1?¡ê?a¨º¡À2¨²¨¦¨²MM_WOM_DONE ???¡é?¡ê¨¨?1??1¨®D?o3???¨°a2£¤¡¤?¡ê??¨°3¨¬D¨°?¨¢?¨²?a¨º¡À???¨¹??¡ä?¦ÌY??API?¡ê¨®¨¦¨®¨²RECORD1??2£¤¡¤?¨°???¡ä¨®?o3???¡ê?¨°¨°¡ä?3¨¬D¨°2??¨´?¨°¦Ì£¤¦Ì?¡Á?¡À?¡À¨º¨¬a¡ê???¨º?¦Ì¡Â¨®?waveOutClose?¡êwaveOutCloseo¡¥¨ºy2¨²¨¦¨²MM_WOM_CLOSE???¡é?¡ê?¨²¡ä????¡é¡ä|¨¤¨ª?¨²??¡ê?RECORD1¨º1?¨¤¨®|¦Ì?¡ã¡ä?£¤¨®DD¡ì?¨°?TD¡ì¡ê?2¡é?¨ºD¨ª¨¦¨´¨°??¨´¡ä?2£¤¡¤??¨°??????D?¨¦¨´¨°??¡ê

3¨¬D¨°?D?1¨®D¨°????¡ãEnd?¡À¡ã¡ä?£¤¡ê?¨¤?¨®?¡ä?¡ã¡ä?£¤¡ê?¨º1¨®????¨¦¨°??¨²2£¤¡¤?¨ª¨º¡ä¡é¡ä??o3??????¡ã¦Ì?¨¨?o?¨º¡À?¨¬¨ª¡ê?12£¤¡¤??¡ê?¡ãEnd?¡À¡ã¡ä?£¤2¨²¨¦¨²¨°???WM_COMMAND???¡é¡ê????DwParam¦Ì¨¨¨®¨²IDC_PLAY_END¡ê??¨¬¨®|¨º¡À¡ê?3¨¬D¨°¦Ì¡Â¨®?waveOutReset¡ê?¡ä?o¡¥¨ºy2¨²¨¦¨²¨°?¨¬??y3¡ê¡ä|¨¤¨ª¦Ì?MM_WOM_DONE???¡é?¡ê

RECORD1¦Ì?¡ä¡ã?¨²?D?1¡ã¨¹¨¤¡§¨°????¡ãPause?¡À¡ã¡ä?£¤?¡ê¡ä|¨¤¨ª¡ä?¡ã¡ä?£¤o¨¹?¨°¦Ì£¤¡êo¦Ì¨²¨°?¡ä?¡ã¡ä¨º¡À??¡ê?RECORD1¦Ì¡Â¨®?waveOutPause¨¤¡ä?Y¨ª¡ê2£¤¡¤?¡ê?2¡é??¡ã¡ä?£¤¨¦?¦Ì???¡Á????a?¡ãResume?¡À?¡ê¡ã¡ä???¡ãResume?¡À¡ã¡ä?£¤¨º¡À¡ê?¨ª¡§1y¦Ì¡Â¨®?waveOutRestart¨¤¡ä?¨¬D?2£¤¡¤??¡ê

?a¨¢?¨º13¨¬D¨°?¨¹¨®D¨¨¡è¡ê?¡ä¡ã?¨²?D?1¡ã¨¹¨¤¡§¨¢¨ª¨ªa¨¨y??¡ã¡ä?£¤¡êo?¡ãReverse?¡À?¡é?¡ãRepeat?¡Ào¨ª?¡ãSpeedup?¡À?¡ê?aD?¡ã¡ä?£¤??2¨²¨¦¨²WM_COMMAND???¡é¡ê????DwParam¦Ì??¦Ì¡¤?¡Àe¦Ì¨¨¨®¨²IDC_PLAY_REV?¡éIDC_PLAY_REPo¨ªIDC_PLAY_SPEED?¡ê

¦Ì1¡¤?¨¦¨´¨°??¨ª¨º?¡ã?¡ä¡é¡ä??o3???¨¤?¦Ì?¨ºy?Y¡ã¡ä¡Á??¨²?3D¨°¡¤¡ä?¨°¡ê?¨¨?o¨®?¨´?y3¡ê2£¤¡¤??¡êRECORD1?D¨®D¨°???3??aReverseMemory¦Ì?D?o¡¥¨ºy¨º1¡Á??¨²¡¤¡ä?¨°?¡ê?¨²WM_COMMAND???¡é¡ä|¨¤¨ª?¨²??¡ê?3¨¬D¨°?¨²2£¤¡¤??¨¦???¡ã¦Ì¡Â¨®?¡ä?o¡¥¨ºy¡ê?2¡é?¨²MM_WOM_CLOSE???¡é¦Ì?o¨®?¨²?¨´¡ä?¦Ì¡Â¨®?¡ä?o¡¥¨ºy¡ê?¨°?¡À????????¡ä¦Ì??y3¡ê¡Á¡ä¨¬??¡ê

?¡ãRepeat?¡À¡ã¡ä?£¤??¨ª¨´?¡ä2?¨ª¡ê¦Ì?2£¤¡¤?¨¦¨´¨°??¡ê¨®¨¦¨®¨²API?¡ì3????¡ä2£¤¡¤?¨¦¨´¨°?¡ê??¨´¨°??a2¡é2??¡ä?¨®?¡ê??¨°a??WAVEHDR?¨¢11¦Ì?dwLoops¡Á???¨¦¨¨?a???¡ä¡ä?¨ºy¡ê???dwFlags¡Á???¨¦¨¨?aWHDR_BEGINLOOPo¨ªWHDR_ENDLOOP¡ê?¡¤?¡Àe¡À¨ª¨º??-?¡¤¨º¡À?o3???¦Ì??a¨º?2?¡¤?o¨ª?¨¢¨º?2?¡¤??¡ê¨°¨°?aRECORD1??¨º1¨®?¨°????o3???¨¤¡ä2£¤¡¤?¨¦¨´¨°?¡ê??¨´¨°??a¨¢???¡À¨º??¡Á¨¦o?¦Ì?¨¢?dwFlags¡Á????¡ê

¨°a¨º¦Ì??¨¢?¡À??¨´2£¤¡¤?¨°2o¨¹¨¨Y¨°¡Á?¡ê?¨²¡Á?¡À??a¨º?3???¡ä¨°?a2¡§D?¨¦¨´¨°??¨²??¡ê?3?¨º??¡¥WAVEFORMATEX?¨¢11¦Ì?¡Á???¨º¡À¡ê???D¨¨??nSamplesPerSeco¨ªnAvgBytesPerSec¡Á???¨¦¨¨?¡§?a22050¡ê???2?¨º?11025?¡ê

¨¢¨ª¨°???MCI?¨®?¨²

?¨²?¨¦?¨¹¨°??-¡¤¡é??¡ê?RECORD1o¨¹?¡ä?¨®?¡ê¨¬?¡Àe¨º??¨²¡ä|¨¤¨ª2¡§D?¨¦¨´¨°?o¡¥¨ºy¦Ì¡Â¨®?o¨ª?¨¹??2¨²¨¦¨²¦Ì????¡é??¦Ì????£¤¨º¡À¡ê??¨¹?¡ä?¨®?¡ê¡ä|¨¤¨ª?¨¦?¨¹3???¦Ì??¨²¡ä?2?¡Á?¦Ì??¨¦??¨°2¨º?¨¨?¡ä??¡ê¦Ì??a¨°2D¨ª?y¨º??¨¹3??a¦Ì¨ª?¡Á????¦Ì??-¨°¨°?¡ê?¨°?¨²¡À???¦Ì??¡ã??¨¬¨¢¦Ì?1y¡ê?Windows¨°2¨¬¨¢1????¡Á??¨¬??????¨®?¨²¡ê¡§Media Control Interface¡ê??¡ê

??2¡§D?¨¦¨´¨°?¨¤¡ä?¦Ì¡ê?¦Ì¨ª?¡Á?¨®?¨²¨®?MCI????¦Ì??¡Â¨°a??¡Àe?¨²¨®¨²MCI¨®?2¡§D????t????¨¦¨´¨°?¨ºy?Y¡ê?2¡é¨ª¡§1y?¨¢¨¨????t¨¤¡ä2£¤¡¤?¨¦¨´¨°??¡ê¨®¨¦¨®¨²?¨²2£¤¡¤?¨¦¨´¨°????¡ã¨°a?¨¢¨¨????t?¡é¡ä|¨¤¨ª???t¨¨?o¨®?¨´D¡ä¨¨????t¡ê??¨´¨°?¨¨?RECODE1¨¤¡ä¨º¦Ì???¡ã¨¬?¨ºaD¡ì1??¡Ào¨¹¨¤¡ì???¡ê?a¨º?¦Ì?D¨ª¦Ì??????????¨º¨¬a¡êo1|?¨¹??¨¨??¨°¨º?¨º1¨®?¡¤?¡À?¡ê?¦Ì¨ª?¡Á?¨®?¨²o¨¹¨¢¨¦??¡ê?¦Ì?MCI¡ê¡§???D¦Ì?¡ä¨®2?¡¤?¡ê??¨¹¡¤?¡À??¡ê

MCI¨®D¨¢???2?¨ª?¦Ì?¨®??¨¤1?¦Ì?¨º¦Ì??D?¨º??¡ê¨°???D?¨º?¨®????¡éo¨ª¨ºy?Y?¨¢11???¨¹¨¢?¡¤¡é?¨ª???¨¤??¨¬?¨¦¨¨¡À?¡ê?¨¨?o¨®?¨´¡ä¨®??¨¤??¨®¨º?D??¡é?¡ê¨¢¨ª¨°???D?¨º?¨º1¨®?ASCII??¡Á?¡Á?¡¤?¡ä??¡ê?¡§¨¢¡é??¡Á??¨¹¨¢?¦Ì??¨®?¨²¡Á?3?¨º??a¨¢?¨¨??¨¤??¨¬?¨¦¨¨¡À??¨®¨º¨¹?¨°¦Ì£¤¦Ì??¨¨¨º??¨¹¨¢?¨®???¦Ì??????¡ê¦Ì??¨¹¨°2¨¬¨¢1?¡¤?3¡ê¨¨Y¨°¡Á¦Ì????£¤????¡ê???2???¡À????¡ã??¡ê?TESTMCI3¨¬D¨°¦Ì??1¨º??¡ê

RECORD23¨¬D¨°¡ê?¨¨?3¨¬D¨°22-4?¨´¨º?¡ê?¨º1¨®?MCID?¨º?¦Ì????¡éo¨ª¨ºy?Y?¨¢11¨¤¡ä¨º¦Ì??¨¢¨ª¨°???¨ºy¡Á?¨¦¨´¨°???¨°??¨²o¨ª2£¤¡¤??¡Â?¡ê??¨¨??¨¹¨º1¨®?¦Ì????¡ã?¨°?¡ê¡ã?¨®?RECORD1¨°??¨´¡ê?¦Ì?2¡é??¨®D¨º¦Ì??¨¨y??¨¬?¨ºaD¡ì1?¦Ì?¡ã¡ä?£¤?¡ê

 3¨¬D¨°22-4  RECORD2
RECORD2.C /*--------------------------------------------------------------------------- RECORD2.C -- Waveform Audio Recorder (c) Charles Petzold, 1998 ------------------------------------------------------------------------*/ #include <windows.h> #include "..\\record1\\resource.h" BOOL CALLBACK DlgProc (HWND, UINT, WPARAM, LPARAM) ; TCHAR szAppName [] = TEXT ("Record2") ; int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { if (-1 == DialogBox (hInstance, TEXT ("Record"), NULL, DlgProc)) { MessageBox ( NULL, TEXT ("This program requires Windows NT!"), szAppName, MB_ICONERROR) ; } return 0 ; } void ShowError (HWND hwnd, DWORD dwError) { TCHAR szErrorStr [1024] ; mciGetErrorString (dwError, szErrorStr, sizeof (szErrorStr) / sizeof (TCHAR)) ; MessageBeep (MB_ICONEXCLAMATION) ; MessageBox (hwnd, szErrorStr, szAppName, MB_OK | MB_ICONEXCLAMATION) ; } BOOL CALLBACK DlgProc ( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { static BOOL bRecording, bPlaying, bPaused ; static TCHAR szFileName[] = TEXT ("record2.wav") ; static WORD wDeviceID ; DWORD dwError ; MCI_GENERIC_PARMS mciGeneric ; MCI_OPEN_PARMS mciOpen ; MCI_PLAY_PARMS mciPlay ; MCI_RECORD_PARMS mciRecord ; MCI_SAVE_PARMS mciSave ; switch (message) { case WM_COMMAND: switch (wParam) { case IDC_RECORD_BEG: // Delete existing waveform file DeleteFile (szFileName) ; // Open waveform audio mciOpen.dwCallback = 0 ; mciOpen.wDeviceID = 0 ; mciOpen.lpstrDeviceType = TEXT ("waveaudio") ; mciOpen.lpstrElementName = TEXT ("") ; mciOpen.lpstrAlias = NULL ; dwError = mciSendCommand (0, MCI_OPEN, MCI_WAIT | MCI_OPEN_TYPE | MCI_OPEN_ELEMENT, (DWORD) (LPMCI_OPEN_PARMS) &mciOpen) ; if (dwError != 0) { ShowError (hwnd, dwError) ; return TRUE ; } // Save the Device ID wDeviceID = mciOpen.wDeviceID ; // Begin recording mciRecord.dwCallback = (DWORD) hwnd ; mciRecord.dwFrom = 0 ; mciRecord.dwTo = 0 ; mciSendCommand (wDeviceID, MCI_RECORD, MCI_NOTIFY, (DWORD) (LPMCI_RECORD_PARMS) &mciRecord) ; // Enable and disable buttons EnableWindow (GetDlgItem (hwnd, IDC_RECORD_BEG), FALSE); EnableWindow (GetDlgItem (hwnd, IDC_RECORD_END), TRUE) ; EnableWindow (GetDlgItem (hwnd, IDC_PLAY_BEG), FALSE); EnableWindow (GetDlgItem (hwnd, IDC_PLAY_PAUSE), FALSE); EnableWindow (GetDlgItem (hwnd, IDC_PLAY_END), FALSE); SetFocus (GetDlgItem (hwnd, IDC_RECORD_END)) ; bRecording = TRUE ; return TRUE ; case IDC_RECORD_END: // Stop recording mciGeneric.dwCallback = 0 ; mciSendCommand (wDeviceID, MCI_STOP, MCI_WAIT, (DWORD) (LPMCI_GENERIC_PARMS) &mciGeneric) ; // Save the file mciSave.dwCallback = 0 ; mciSave.lpfilename = szFileName ; mciSendCommand (wDeviceID, MCI_SAVE, MCI_WAIT | MCI_SAVE_FILE, (DWORD) (LPMCI_SAVE_PARMS) &mciSave) ; // Close the waveform device mciSendCommand (wDeviceID, MCI_CLOSE, MCI_WAIT, (DWORD) (LPMCI_GENERIC_PARMS) &mciGeneric) ; // Enable and disable buttons EnableWindow (GetDlgItem (hwnd, IDC_RECORD_BEG), TRUE); EnableWindow (GetDlgItem (hwnd, IDC_RECORD_END), FALSE); EnableWindow (GetDlgItem (hwnd, IDC_PLAY_BEG), TRUE); EnableWindow (GetDlgItem (hwnd, IDC_PLAY_PAUSE), FALSE); EnableWindow (GetDlgItem (hwnd, IDC_PLAY_END), FALSE); SetFocus (GetDlgItem (hwnd, IDC_PLAY_BEG)) ; bRecording = FALSE ; return TRUE ; case IDC_PLAY_BEG: // Open waveform audio mciOpen.dwCallback = 0 ; mciOpen.wDeviceID = 0 ; mciOpen.lpstrDeviceType = NULL ; mciOpen.lpstrElementName = szFileName ; mciOpen.lpstrAlias = NULL ; dwError = mciSendCommand ( 0, MCI_OPEN, MCI_WAIT | MCI_OPEN_ELEMENT, (DWORD) (LPMCI_OPEN_PARMS) &mciOpen) ; if (dwError != 0) { ShowError (hwnd, dwError) ; return TRUE ; } // Save the Device ID wDeviceID = mciOpen.wDeviceID ; // Begin playing mciPlay.dwCallback = (DWORD) hwnd ; mciPlay.dwFrom = 0 ; mciPlay.dwTo = 0 ; mciSendCommand (wDeviceID, MCI_PLAY, MCI_NOTIFY, (DWORD) (LPMCI_PLAY_PARMS) &mciPlay) ; // Enable and disable buttons EnableWindow (GetDlgItem (hwnd, IDC_RECORD_BEG), FALSE); EnableWindow (GetDlgItem (hwnd, IDC_RECORD_END), FALSE); EnableWindow (GetDlgItem (hwnd, IDC_PLAY_BEG), FALSE); EnableWindow (GetDlgItem (hwnd, IDC_PLAY_PAUSE), TRUE) ; EnableWindow (GetDlgItem (hwnd, IDC_PLAY_END), TRUE) ; SetFocus (GetDlgItem (hwnd, IDC_PLAY_END)) ; bPlaying = TRUE ; return TRUE ; case IDC_PLAY_PAUSE: if (!bPaused) // Pause the play { mciGeneric.dwCallback = 0 ; mciSendCommand (wDeviceID, MCI_PAUSE, MCI_WAIT, (DWORD) (LPMCI_GENERIC_PARMS) & mciGeneric); SetDlgItemText (hwnd, IDC_PLAY_PAUSE, TEXT ("Resume")) ; Paused = TRUE ; } else // Begin playing again { mciPlay.dwCallback = (DWORD) hwnd ; mciPlay.dwFrom = 0 ; mciPlay.dwTo = 0 ; mciSendCommand (wDeviceID, MCI_PLAY, MCI_NOTIFY, (DWORD) (LPMCI_PLAY_PARMS) &mciPlay) ; SetDlgItemText (hwnd, IDC_PLAY_PAUSE, TEXT ("Pause")) ; bPaused = FALSE ; } return TRUE ; case IDC_PLAY_END: // Stop and close mciGeneric.dwCallback = 0 ; mciSendCommand (wDeviceID, MCI_STOP, MCI_WAIT, (DWORD) (LPMCI_GENERIC_PARMS) &mciGeneric) ; mciSendCommand (wDeviceID, MCI_CLOSE, MCI_WAIT, (DWORD) (LPMCI_GENERIC_PARMS) &mciGeneric) ; // Enable and disable buttons EnableWindow (GetDlgItem (hwnd, IDC_RECORD_BEG), TRUE) ; EnableWindow (GetDlgItem (hwnd, IDC_RECORD_END), FALSE); EnableWindow (GetDlgItem (hwnd, IDC_PLAY_BEG), TRUE) ; EnableWindow (GetDlgItem (hwnd, IDC_PLAY_PAUSE), FALSE); EnableWindow (GetDlgItem (hwnd, IDC_PLAY_END), FALSE); SetFocus (GetDlgItem (hwnd, IDC_PLAY_BEG)) ; bPlaying = FALSE ; bPaused = FALSE ; return TRUE ; } break ; case MM_MCINOTIFY: switch (wParam) { case MCI_NOTIFY_SUCCESSFUL: if (bPlaying) SendMessage (hwnd, WM_COMMAND, IDC_PLAY_END, 0) ; if (bRecording) SendMessage (hwnd, WM_COMMAND, IDC_RECORD_END, 0); return TRUE ; } break ; case WM_SYSCOMMAND: switch (wParam) { case SC_CLOSE: if (bRecording) SendMessage (hwnd, WM_COMMAND, IDC_RECORD_END, 0L) ; if (bPlaying) SendMessage (hwnd, WM_COMMAND, IDC_PLAY_END, 0L) ; EndDialog (hwnd, 0) ; return TRUE ; } break ; } return FALSE ; }

RECORD2??¨º1¨®?¨¢???MCIo¡¥¨ºy¦Ì¡Â¨®?¡ê????D¡Á???¨°a¦Ì?¦Ì¡Â¨®?¨¨????¨´¨º?¡êo

error = mciSendCommand (wDeviceID, message, dwFlags, dwParam)

¦Ì¨²¨°???2?¨ºy¨º?¨¦¨¨¡À?¦Ì?¨º?¡Àe¨ºy¡Á?¡ê¡§ID¡ê?¡ê??¨²?¨¦¨°?¡ã¡ä¡ä¨²o?¨¤¡ä¨º1¨®?ID?¡ê¡ä¨°?a¨¦¨¨¡À?¨º¡À?¨ª?¨¦¨°???¦Ì?ID¡ê?2¡é?¨²??o¨®¦Ì?mciSendCommand¦Ì¡Â¨®??D¨º1¨®??¡ê¦Ì¨²?t??2?¨ºy¨º??¡ã¡Áo?aMCI¦Ì?3¡ê¨ºy?¡ê?aD?3??aMCI?¨¹¨¢????¡é¡ê?RECORD2?1¨º?¨¢????D¦Ì?????¡êoMCI_OPEN?¡éMCI_RECORD?¡éMCI_STOP?¡éMCI_SAVE?¡éMCI_PLAY?¡éMCI_PAUSEo¨ªMCI_CLOSE?¡ê

dwFlags2?¨ºy¨ª¡§3¡ê¨®¨¦0?¨°???¨¤?????¨¬¡À¨º3¡ê¨ºy¡ê¡§¨®¨¦C¦Ì???OR????¡Á¨®o?3¨¦¡ê?¡Á¨¦3¨¦?¡ê?aD?¨ª¡§3¡ê¨®?¨¤¡ä¡À¨ª¨º?2?¨ª?¦Ì??????¡ê¨°?D?????¨º??3???¨¹¨¢????¡é?¨´¨¬?¨®D¦Ì?¡ê???¨¢¨ª¨°?D????¨´¨®D¦Ì????¡é??¨º?¨ª¡§¨®?¦Ì??¡êdwParam2?¨ºy¨ª¡§3¡ê¨º????¨°¨°???¨ºy?Y?¨¢11¦Ì?3¡è????¡ê????¨¢11¡À¨ª¨º?????¨°??¡ã¨®¨¦¨¦¨¨¡À???¦Ì?¦Ì?D??¡é?¡êD¨ª?¨¤MCI???¡é??¨®?¨ºy?Y?¨¢11¨®D1?¡ê????¨°?aD?¨ºy?Y?¨¢11??¨®¨²???¡é¨¤¡ä?¦Ì??¨º??¡§¨°?¦Ì??¡ê

¨¨?1?mciSendCommando¡¥¨ºy¦Ì¡Â¨®?3¨¦1|¡ê??¨°¡ä???0?¦Ì¡ê?¡¤??¨°¡ä???¡ä¨ª?¨®¡ä¨²???¡ê¨°a?¨°¨º1¨®???¡À¡§??¡ä?¡ä¨ª?¨®¡ê??¨¦¨®?????¦Ì?o¡¥¨ºy??¦Ì??¨¨¨º?¡ä¨ª?¨®¦Ì???¡Á?¡Á?¡¤?¡ä?¡êo

mciGetErrorString (error, szBuffer, dwLength)

¡ä?o¡¥¨ºy?¨²3¨¬D¨°TESTMCI?D¨°2¨®?¦Ì?1y?¡ê

¡ã¡ä???¡ãRecord?¡À¡ã¡ä?£¤o¨®¡ê?RECORD2¦Ì?¡ä¡ã?¨²???¡é¡ä|¨¤¨ª3¨¬D¨°?¨ª¨º?¦Ì?¨°???WM_COMMAND???¡é¡ê????DwParam¦Ì¨¨¨®¨²IDC_RECORD_BEG?¡êRECORD2¡ä¨®¡ä¨°?a¨¦¨¨¡À??a¨º?¡ê?¡ã¨¹¨¤¡§¨¦¨¨?¡§MCI_OPEN_PARMS?¨¢11¦Ì?¡Á???¡ê?2¡é¨®?MCI_OPEN?¨¹¨¢????¡é¦Ì¡Â¨®?mciSendCommand?¡ê??¨°?¨º¡À¡ê?lpstrDeviceType¡Á???¨¦¨¨?¡§?a¡Á?¡¤?¡ä??¡ãwaveaudio?¡À¨°??¦Ì?¡Â¨¦¨¨¡À?D¨ª¨¬?¡ê?lpstrElementName¡Á???¨¦¨¨?¡§?a3¡è?¨¨?a0¦Ì?¡Á?¡¤?¡ä??¡êMCI?y?¡¥3¨¬D¨°¨º1¨®??¨²?¡§¦Ì?¨¨??¨´?¦Ì?¨ºo¨ª¨¨??¨´??¨¨¡¤?¨¨¡ê?¦Ì?¨º??¨²?¨¦¨°?¨®?MCI_SET?¨¹¨¢???DDDT???¡ê??¨°?3¨¬D¨°?D¡ê?¨¦¨´¨°?¨ºy?Y?¨¨¡ä¡é¡ä??¨²¨®2?¨¬¨¦?¦Ì?¨¢¨´¨º¡À???t?D¡ê?¡Á?o¨®?¨´¡Áa?¡¥3¨¦¡À¨º¡Á?¦Ì?2¡§D????t?¡ê¡À???¦Ì?o¨®?????¨¦¨¦¨¹2¡§D????t¦Ì???¨º??¡ê2£¤¡¤?????¦Ì?¨¦¨´¨°?¨º¡À¡ê?MCI¨º1¨®?2¡§D????t?D?¡§¨°?¦Ì?¨¨??¨´?¦Ì?¨ºo¨ª¨¨??¨´??¨¨¡¤?¨¨?¡ê

¨¨?1?RECORD22??¨¹¡ä¨°?a¨¦¨¨¡À?¡ê??¨°¨®?mciGetErrorStringo¨ªMessageBox¨¬¨¢¨º?¡ä¨ª?¨®D??¡é?¡ê¡¤??¨°¡ä¨®mciSendCommand¦Ì¡Â¨®?¡ä???¡ê?MCI_OPEN_PARMS?¨¢11¦Ì?wDeviceID¡Á???¡ã¨¹o?¨®D¨¦¨¨¡À?ID¡ê?¨°?1?o¨®??¦Ì?¦Ì¡Â¨®?¨º1¨®??¡ê

¨°a?a¨º???¨°?¡ê?RECORD2?¨ª¦Ì¡Â¨®?mciSendCommand¡ê?¨°?MCI_RECORD?¨¹¨¢????¡éo¨ªMCI_WAVE_RECORD_PARMS¨ºy?Y?¨¢11?a2?¨ºy?¡ê¦Ì¡À¨¨?¡ê??¨²¨°2?¨¦¨°???¡ä??¨¢11¡ê¡§2¡é¨º1¨®?¡À¨ª¨º??aD?¡Á???¨°?¨¦¨¨?¡§¦Ì????¨¬¡À¨º¡ê?¦Ì?dwFromzo¨ªdwTo¡Á?????DD¨¦¨¨?¡§¡ê?¨°?¡À???¨¦¨´¨°?2?¨¨???¨®D¦Ì?2¡§D????t¡ê??????t???¨²MCI_OPEN_PARMS?¨¢11¦Ì?lpstrElementName¡Á??????¡§?¡ê?¨²?¡§¡Á¡ä¨¬???¡ê?¨¨?o?D?¦Ì?¨¦¨´¨°???2?¨¨??¨²??¨®D???t¦Ì??a¨º??????¡ê

RECORD2??MCI_WAVE_RECORD_PARMS?¨¢11¦Ì?dwCallback¡Á???¨¦¨¨?¡§?a3¨¬D¨°¦Ì?¡ä¡ã?¨²¡ä¨²o?¡ê?2¡é?¨²mciSendCommand¦Ì¡Â¨®??D¡ã¨¹o?MCI_NOTIFY¡À¨º???¡ê?a¦Ì?????¨°??¨¢¨º?o¨®?¨°¡ä¡ã?¨²???¡é¡ä|¨¤¨ª3¨¬D¨°¡¤¡é?¨ª¨°?¨¬?¨ª¡§?a???¡é?¡ê?¨°???¨°¨°a¨¬???¨°????a¨¬?¨ª¡§?a???¡é?¡ê

??¨°??¨¢¨º?o¨®¡ê?¡ã¡ä???¡ã¨°????¡ãEnd?¡À¡ã¡ä?£¤¨¤¡ä¨ª¡ê?1??¨°?¡ê??a¨º¡À2¨²¨¦¨²¨°???WM_COMMAND???¡é¡ê????DwParam¦Ì¨¨¨®¨²IDC_RECORD_END?¡ê?¨¬¨®|¨º¡À¡ê?¡ä¡ã?¨²???¡é¡ä|¨¤¨ª3¨¬D¨°??¦Ì¡Â¨®?mciSendCommand¨¨y¡ä?¡êoMCI_STOP?¨¹¨¢????¡é¨®?¨®¨²¨ª¡ê?1??¨°?¡ê?MCI_SAVE?¨¹¨¢????¡é¨®?¨®¨²¡ã?¨¢¨´¨º¡À???t?D¦Ì?¨¦¨´¨°?¨ºy?Y¡ä?¦ÌY¦Ì?MCI_SAVE_PARMS?¨¢11?D???¡§¦Ì????t¡ê¡§?¡ãrecord2.wav?¡À¡ê?¡ê?MCI_CLOSE?¨¹¨¢????¡é¨®?¨®¨²¨¦?3y?¨´¨®D¦Ì?¨¢¨´¨º¡À???t?¡é¨º¨ª¡¤?¨°??-?¡§¨¢¡é¦Ì??¨²¡ä??¨¦2¡é1?¡À?¨¦¨¨¡À??¡ê

2£¤¡¤?¨º¡À¡ê?MCI_OPEN_PARMS?¨¢11¦Ì?lpstrElementName¡Á???¨¦¨¨?¡§?a???t???¡ãrecord2.wav?¡À?¡ê mciSendCommand¦Ì¨²¨¨y??2?¨ºy?D?¨´¡ã¨¹o?¦Ì?MCI_OPEN_ELEMENT¡À¨º??¡À¨ª¨º?lpstrElementName¡Á???¨º?¨°???¨®DD¡ì¦Ì????t???¡ê¨ª¡§1y???t¦Ì?¨¤??1??3?.WAV¡ê?MCI?a¦Ì¨¤¨º1¨®???¨°a¡ä¨°?a¨°???2¡§D?¨¦¨´¨°?¨¦¨¨¡À??¡ê¨¨?1?¡ä??¨²?¨¤??2¡§D?¨®2?t¡ê??¨°¡ä¨°?a¦Ì¨²¨°???¡ê¡§¨¦¨¨?¡§MCI_OPEN_PARMS?¨¢11¦Ì?lpstrDeviceType¡Á???¡ê?¨°2?¨¦¨°?¡ä¨°?a???¨¹2¡§D?¨¦¨¨¡À?¡ê??¡ê

2£¤¡¤???¡ã¨¹¨¤¡§¡ä?¨®DMCI_PLAY?¨¹¨¢????¡éo¨ªMCI_PLAY_PARMS?¨¢11¦Ì?mciSendCommand¦Ì¡Â¨®??¡ê??¨¨?2¡§D????t¦Ì?¨¨?¨°a2?¡¤????¨¦¨°?2£¤¡¤?¡ê?¦Ì?RECORD2??2£¤¡¤????????t?¡ê

RECORD2?1¡ã¨¹¨¤¡§¨°????¡ãPause?¡À¡ã¡ä?£¤¨¤¡ä?Y¨ª¡ê2£¤¡¤?¨¦¨´¨°????t?¡ê?a??¡ã¡ä?£¤2¨²¨¦¨²¨°???WM_COMMAND???¡é¡ê????DwParam¦Ì¨¨¨®¨²IDC_PLAY_PAUSE?¡ê?¨¬¨®|¨º¡À¡ê?3¨¬D¨°??¦Ì¡Â¨®?mciSendCommand¡ê?2¡é¨°?MCI_PAUSE?¨¹¨¢????¡éo¨ªMCI_GENERIC_PARMS?¨¢11¡Á¡Â?a2?¨ºy?¡êMCI_GENERIC_PARMS?¨¢11¨®?¨®¨²?a?¨´¨°?D????¡é¡êo?¨¹??3y¨¢?D¨¨¨°a¨®?¨®¨²¨ª¡§?a¦Ì??¨¦??¡ä¡ã?¨²¡ä¨²o?¨ªa¡ê?2?D¨¨¨°a¨¨?o?D??¡é?¡ê¨¨?1?2£¤¡¤?¨°??-?Y¨ª¡ê¡ê??¨°¨ª¡§1y?¨´¡ä?¨º1¨®?MCI_PLAY?¨¹¨¢????¡é¦Ì¡Â¨®?mciSendCommand?¨¬D?2£¤¡¤??¡ê

¡ã¡ä??¦Ì¨²?t???¡ãEnd?¡À¡ã¡ä?£¤¨°2?¨¦¨°?¨ª¡ê?12£¤¡¤??¡ê?a¨º¡À2¨²¨¦¨²wParam¦Ì¨¨¨®¨²IDC_PLAY_END¦Ì?WM_COMMAND???¡é?¡ê?¨¬¨®|¨º¡À¡ê?¡ä¡ã?¨²???¡é¡ä|¨¤¨ª3¨¬D¨°??¦Ì¡Â¨®?mciSendCommand¨¢?¡ä?¡êo¦Ì¨²¨°?¡ä?¨º1¨®?MCI_STOP?¨¹¨¢????¡é¡ê?¦Ì¨²?t¡ä?¨º1¨®?MCI_CLOSE?¨¹¨¢????¡é?¡ê

???¨²¨®D¨°????¨º¨¬a¡êo??¨¨??¨¦¨°?¨ª¡§1y¡ã¡ä???¡ãEnd?¡À¡ã¡ä?£¤¨¤¡ä¨º?1¡è???12£¤¡¤?¡ê?¦Ì??¨²?¨¦?¨¹D¨¨¨°a2£¤¡¤????????t?¡ê3¨¬D¨°¨¨?o??a¦Ì¨¤???t2£¤¡¤?¨ª¨º¦Ì?¨º¡À????¡ê??a¨º?MCI¨ª¡§?a???¡é¦Ì?¨¨????¡ê

¦Ì¡À¡ä?¨®DMCI_RECORDo¨ªMCI_PLAY???¡é¨¤¡ä¦Ì¡Â¨®?mciSendCommand¨º¡À¡ê?RECORD2??¡ã¨¹¨¤¡§MCI_NOTIFY¡À¨º??¡ê?2¡é??¨ºy?Y?¨¢11¦Ì?dwCallback¡Á???¨¦¨¨?¡§?a3¨¬D¨°¡ä¡ã?¨²¡ä¨²o??¡ê?a?¨´?¨ª2¨²¨¦¨²¨°???¨ª¡§?a???¡é¡ê?3??aMM_MCINOTIFY¡ê?2¡é?¨²?3D??¡¤?3??¡ä?¦ÌY??¡ä¡ã?¨²???¡é¡ä|¨¤¨ª3¨¬D¨°?¡ê???¡é2?¨ºywParam¨º?¨°???¡Á¡ä¨¬?¡ä¨²??¡ê???lParam¨º?¨¦¨¨¡À?ID?¡ê

¡ä?¨®DMCI_STOP?¨°??MCI_PAUSE?¨¹¨¢????¡é¨¤¡ä¦Ì¡Â¨®?mciSendCommand¨º¡À¡ê??¨²???¨®¨º?¦Ì?¨°???MM_MCINOTIFY???¡é¡ê????DwParam¦Ì¨¨¨®¨²MCI_NOTIFY_ABORTED?¡ê¦Ì¡À?¨²¡ã¡ä???¡ãPause?¡À¡ã¡ä?£¤?¨°??¨¢????¡ãEnd?¡À¡ã¡ä?£¤?D¦Ì?¨°???¨º¡À¡ê??¨ª?¨¢3????a???¨¦???¡ê¨®¨¦¨®¨²???aD?¡ã¡ä?£¤¨°???DD1y¨º¨º¦Ì¡À¦Ì?¡ä|¨¤¨ª¡ê??¨´¨°?RECORD2?¨¦¨°?o????a???¨¦???¡ê2£¤¡¤?¨º¡À¡ê??¨²?¨¢?¨²¨¦¨´¨°????t?¨¢¨º?o¨®?¨®¨º?¦Ì?MM_MCINOTIFY???¡é¡ê????DwParam¦Ì¨¨¨®¨²MCI_NOTIFY_SUCCESSFUL?¡ê?a???¨¦????¡ê?¡ä¡ã?¨²???¡é¡ä|¨¤¨ª3¨¬D¨°??¡Á??o¡¤¡é?¨ª¨°???WM_COMMAND???¡é¡ê????DwParam¦Ì¨¨¨®¨²IDC_PLAY_END¡ê?¨¤¡ä¡¤???¨º1¨®???¡ã¡ä???¡ãEnd?¡À¡ã¡ä?£¤?¡ê¨¨?o¨®¡ä¡ã?¨²???¡é¡ä|¨¤¨ª3¨¬D¨°¡Á¡Â3??y3¡ê?¨¬¨®|¡êo¨ª¡ê?12£¤¡¤?¡ê?1?¡À?¨¦¨¨¡À??¡ê

??¨°?¨º¡À¡ê?¨¨?1?¨®?¨®¨²¡ä¡é¡ä?¨¢¨´¨º¡À???t¦Ì?¨®2?¨¬????2?1?¡ê??¨²?¨ª?¨¢?¨®¨º?¨°???MM_MCINOTIFY???¡é¡ê????DwParam¦Ì¨¨¨®¨²MCI_NOTIFY_SUCCESSFUL¡ê¡§??¨¨????¨²?12??¨¹?¦Ì?¨¹o¨¹¨ª¨º?¨¤¡ê?¦Ì???1|?¨¹¨°??-o¨¹??¨¨?¨¢?¡ê??¡ê?¨¬¨®|¨º¡À¡ê?¡ä¡ã?¨²???¡é¡ä|¨¤¨ª3¨¬D¨°??¡Á??o¡¤¡é?¨ª¨°???WM_COMMAND???¡é¡ê????DwParam¦Ì¨¨¨®¨²IDC_RECORD_END¡ê?¨¨?o¨®¨®??y3¡ê?¨¦????¨°??¨´¡êo¨ª¡ê?1??¨°??¡é¡ä¡é¡ä????t2¡é1?¡À?¨¦¨¨¡À??¡ê

MCI?¨¹¨¢?¡Á?¡¤?¡ä?¦Ì?¡¤?¡¤¡§

Windows¦Ì??¨¤??¨¬??¨®?¨²???-¡ã¨¹o?o¡¥¨ºymciExecute¡ê???¨®?¡¤¡§¨¨???¡êo

bSuccess = mciExecute (szCommand) ;

???D?¡§¨°?¦Ì?2?¨ºy¨º?MCI?¨¹¨¢?¡Á?¡¤?¡ä??¡êo¡¥¨ºy¡ä???2????¦Ì?a?a¨¨?1?¦Ì¡Â¨®?3¨¦1|¡ê??¨°¡ä???¡¤?0?¦Ì¡ê?¡¤??¨°¡ä???0?¡ê?¨²1|?¨¹¨¦?¡ê?mciExecuteo¡¥¨ºy?¨¤¨ª?¨®¨²¦Ì¡Â¨®?o¨®¨¨y??2?¨ºy?aNULL?¨°0¦Ì?mciSendString¡ê¡§TESTMCI?D¨º1¨®?¦Ì?¨°¨¤?Y¡Á?¡¤?¡ä?¦Ì?MCIo¡¥¨ºy¡ê?¡ê?¨¨?o¨®?¨²¡¤¡é¨¦¨²¡ä¨ª?¨®¨º¡À¦Ì¡Â¨®?mciGetErrorStringo¨ªMessageBox?¡ê

??¨¨?mciExecute2??¨´¨º?API¦Ì?¨°?2?¡¤?¡ê?¦Ì??¨°?1¨º??¨²RECORD3¡ã?¦Ì?¨ºy¡Á???¨°??¨²?D¨º1¨®?¨¢??a??o¡¥¨ºy?¡êo¨ªRECORD2¨°??¨´¡ê?RECORD33¨¬D¨°¨°2¨º1¨®?RECORD1?D¦Ì?¡Á¨º?¡ä?¨¨¨º?¦Ì¦ÌRECORD.RCo¨ªRESOURCE.H¡ê?¨¨?3¨¬D¨°22-5?¨´¨º??¡ê

 3¨¬D¨°22-5  RECORD3
RECORD3.C /*--------------------------------------------------------------------------- RECORD3.C -- Waveform Audio Recorder (c) Charles Petzold, 1998 ----------------------------------------------------------------------------*/ #include <windows.h> #include "..\\record1\\resource.h" BOOL CALLBACK DlgProc (HWND, UINT, WPARAM, LPARAM) ; TCHAR szAppName [] = TEXT ("Record3") ; int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { if (-1 == DialogBox (hInstance, TEXT ("Record"), NULL, DlgProc)) { MessageBox ( NULL, TEXT ("This program requires Windows NT!"), szAppName, MB_ICONERROR) ; } return 0 ; } BOOL mciExecute (LPCTSTR szCommand) { MCIERROR error ; TCHAR szErrorStr [1024] ; if (error = mciSendString (szCommand, NULL, 0, NULL)) { mciGetErrorString (error, szErrorStr, sizeof (szErrorStr) / sizeof (TCHAR)) ; MessageBeep (MB_ICONEXCLAMATION) ; MessageBox ( NULL, szErrorStr, TEXT ("MCI Error"), MB_OK | MB_ICONEXCLAMATION) ; } return error == 0 ; } BOOL CALLBACK DlgProc ( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { static BOOL bRecording, bPlaying, bPaused ; switch (message) { case WM_COMMAND: switch (wParam) { case IDC_RECORD_BEG: // Delete existing waveform file DeleteFile (TEXT ("record3.wav")) ; // Open waveform audio and record if (!mciExecute (TEXT ("open new type waveaudio alias mysound"))) return TRUE ; mciExecute (TEXT ("record mysound")) ; // Enable and disable buttons EnableWindow (GetDlgItem (hwnd, IDC_RECORD_BEG), FALSE); EnableWindow (GetDlgItem (hwnd, IDC_RECORD_END), TRUE) ; EnableWindow (GetDlgItem (hwnd, IDC_PLAY_BEG), FALSE); EnableWindow (GetDlgItem (hwnd, IDC_PLAY_PAUSE), FALSE); EnableWindow (GetDlgItem (hwnd, IDC_PLAY_END), FALSE); SetFocus (GetDlgItem (hwnd, IDC_RECORD_END)) ; bRecording = TRUE ; return TRUE ; case IDC_RECORD_END: // Stop, save, and close recording mciExecute (TEXT ("stop mysound")) ; mciExecute (TEXT ("save mysound record3.wav")) ; mciExecute (TEXT ("close mysound")) ; // Enable and disable buttons EnableWindow (GetDlgItem (hwnd, IDC_RECORD_BEG), TRUE) ; EnableWindow (GetDlgItem (hwnd, IDC_RECORD_END), FALSE); EnableWindow (GetDlgItem (hwnd, IDC_PLAY_BEG), TRUE) ; EnableWindow (GetDlgItem (hwnd, IDC_PLAY_PAUSE), FALSE); EnableWindow (GetDlgItem (hwnd, IDC_PLAY_END), FALSE); SetFocus (GetDlgItem (hwnd, IDC_PLAY_BEG)) ; bRecording = FALSE ; return TRUE ; case IDC_PLAY_BEG: // Open waveform audio and play if (!mciExecute (TEXT ("open record3.wav alias mysound"))) return TRUE ; mciExecute (TEXT ("play mysound")) ; // Enable and disable buttons EnableWindow (GetDlgItem (hwnd, IDC_RECORD_BEG), FALSE); EnableWindow (GetDlgItem (hwnd, IDC_RECORD_END), FALSE); EnableWindow (GetDlgItem (hwnd, IDC_PLAY_BEG), FALSE); EnableWindow (GetDlgItem (hwnd, IDC_PLAY_PAUSE), TRUE) ; EnableWindow (GetDlgItem (hwnd, IDC_PLAY_END), TRUE) ; SetFocus (GetDlgItem (hwnd, IDC_PLAY_END)) ; bPlaying = TRUE ; return TRUE ; case IDC_PLAY_PAUSE: if (!bPaused) // Pause the play { mciExecute (TEXT ("pause mysound")) ; SetDlgItemText (hwnd, IDC_PLAY_PAUSE, TEXT ("Resume")) ; bPaused = TRUE ; } else // Begin playing again { mciExecute (TEXT ("play mysound")) ; SetDlgItemText (hwnd, IDC_PLAY_PAUSE, TEXT ("Pause")) ; bPaused = FALSE ; } return TRUE ; case IDC_PLAY_END: // Stop and close mciExecute (TEXT ("stop mysound")) ; mciExecute (TEXT ("close mysound")) ; // Enable and disable buttons EnableWindow (GetDlgItem (hwnd, IDC_RECORD_BEG), TRUE) ; EnableWindow (GetDlgItem (hwnd, IDC_RECORD_END), FALSE); EnableWindow (GetDlgItem (hwnd, IDC_PLAY_BEG), TRUE) ; EnableWindow (GetDlgItem (hwnd, IDC_PLAY_PAUSE), FALSE); EnableWindow (GetDlgItem (hwnd, IDC_PLAY_END), FALSE); SetFocus (GetDlgItem (hwnd, IDC_PLAY_BEG)) ; bPlaying = FALSE ; bPaused = FALSE ; return TRUE ; } break ; case WM_SYSCOMMAND: switch (wParam) { case SC_CLOSE: if (bRecording) SendMessage (hwnd, WM_COMMAND, IDC_RECORD_END, 0L); if (bPlaying) SendMessage (hwnd, WM_COMMAND, IDC_PLAY_END, 0L) ; EndDialog (hwnd, 0) ; return TRUE ; } break ; } return FALSE ; }

?¨²?D?????¡é¦Ì??¨°o¨ª??¡Á?¦Ì??¨°¦Ì?MCI?¨®?¨²¨º¡À¡ê??¨²?¨¢¡¤¡é???¨¹??¡¤?3¡ê?¨¤?¨¹?¡êo¨¹¨¨Y¨°¡Á?¨ª?¨¦¨°?2?2a3?MCI???¨¹¨¢?¡Á?¡¤?¡ä?¡Áa???a?¨¤¨®|¦Ì??¨¹¨¢????¡éo¨ª¨ºy?Y?¨¢11?¡êRECORD3?¨¦¨°?¨º1¨®???RECORD2¨°??¨´¨º1¨®?MM_MCINOTIFY???¡é¡ê?¦Ì?¨º??¨¹??¨®D????mciExecuteo¡¥¨ºy¦Ì?o?¡ä|¡ê??¨¹¦Ì?¨¨¡À¦Ì?¨º?3¨¬D¨°2??a¦Ì¨¤¨º2?¡ä¨º¡Ào¨°2£¤¡¤?¨ª¨º2¡§D????t?¡ê¨°¨°¡ä?¡ê??aD?¡ã¡ä?£¤2??¨¹¡Á??¡¥??¡À?¡Á¡ä¨¬??¡ê?¨²¡À?D?¨¨?1¡è¡ã¡ä???¡ãEnd?¡À¡ã¡ä?£¤¡ê?¨°?¡À?¨¨?3¨¬D¨°?a¦Ì¨¤?¨¹¨°??-¡Á?¡À??¨´¡ä???¨°??¨°2£¤¡¤??¡ê

¡Á¡é¨°aMCI¦Ì?open?¨¹¨¢??Dalias1??¨¹¡ä¨º¦Ì?¨®?¡¤¡§?¡ê?¨¹?¨ºD¨ª?¨´¨®Do¨®¨¤¡ä¦Ì?MCI?¨¹¨¢?¨º1¨®?¡Àe??¨¤¡ä¨°y¨®?¨¦¨¨¡À??¡ê

2¡§D?¨¦¨´¨°????t??¨º?

¨¨?1??¨²¨º?¨¢¨´????¡Áa¡ä¡é3¨¬D¨°???D???¡ä?1??¦Ì?.WAV???t¡ê¡§?¡äPCM¡ê?¡ê??¨²?¨¢¡¤¡é???¨¹????¨®D¡À¨ª22-1?¨´¨º?¦Ì???¨º??¡ê

¡À¨ª22-1 .WAV???t??¨º?
??¨°?¨¢?¡Á??¨²¨ºy?Y
00004?¡ãRIFF?1
000442¡§D??¨¦¦Ì?¡ä¨®D?¡ê¡§???t¡ä¨®D???8¡ê?
00084?¡ãWAVE?1
000C4?¡ãfmt ?1
00104??¨º??¨¦¦Ì?¡ä¨®D?¡ê¡§16¡Á??¨²¡ê?
00142wf.wFormatTag = WAVE_FORMAT_PCM = 1
00162wf.nChannels
00184wf.nSamplesPerSec
001C4wf.nAvgBytesPerSec
00202wf.nBlockAlign
00222wf.wBitsPerSample
00244?¡ãdata?1
002842¡§D?¡Á¨º¨¢?¦Ì?¡ä¨®D?
002C 2¡§D?¨ºy?Y

?a¨º?¨°???¨¤?3?¡Á?RIFF¡ê¡§Resource Interchange File Format¡êo¡Á¨º?¡ä???????t??¨º?¡ê?¦Ì???¨º??¡êRIFF¨º?¨®?¨®¨²?¨¤??¨¬?¨ºy?Y???t¦Ì?¨ª¨°¨®???¨º?¡ê??¨¹¨º?¨°???¡À¨º?????t??¨º??¡ê?¨²?a????¨º???¡ê????t¨®¨¦¨ºy?Y?¡ã?¨¦?¡À¡Á¨¦3¨¦¡ê????aD?¨ºy?Y?¨¦?¨°¨®¨¦?¡ã??4??¡Á?¡¤?¦Ì?ASCII??3?o¨ª4¡Á??¨²¡ê¡§32??¡ê?¦Ì?¨ºy?Y?¨¦¡ä¨®D?¨¤¡ä¨¨¡¤¨¨??¡ê¨ºy?Y?¨¦¡ä¨®D??¦Ì2?¡ã¨¹¨¤¡§??3?o¨ª¡ä¨®D??¨´D¨¨¨°a¦Ì?8¡Á??¨²?¡ê

2¡§D?¨¦¨´¨°????t¨°???¡Á?¡Á?¡¤?¡ä??¡ãRIFF?¡À?a¨º?¡ê?¨®?¨¤¡ä¡À¨º¨º??a¨º?¨°???RIFF???t?¡ê¡Á?¡¤?¡ä?o¨®??¨º?¨°???32??¦Ì?¨ºy?Y?¨¦¡ä¨®D?¡ê?¡À¨ª¨º????t??¨®¨¤2?¡¤?¦Ì?¡ä¨®D?¡ê??¨°??¨º?D?¨®¨²8¡Á??¨²¦Ì????t¡ä¨®D??¡ê

¨ºy?Y?¨¦¨°???¡Á?¡Á?¡¤?¡ä??¡ãWAVE?¡À?a¨º?¡ê?¨®?¨¤¡ä¡À¨º¨º??a¨º?¨°???2¡§D?¨¦¨´¨°??¨¦¡ê?o¨®??¨º???¡Á?¡Á?¡¤?¡ä??¡ãfmt?¡À?a?a¡Á¡é¨°a¨®???¡ã¡Á¨º1??3¨¦?a4¡Á?¡¤?¦Ì?¡Á?¡¤?¡ä??a?a¨®?¨¤¡ä¡À¨º¨º?¡ã¨¹o?2¡§D?¨¦¨´¨°?¨ºy?Y??¨º?¦Ì?¡Á¨®¨ºy?Y?¨¦?¡ê?¡ãfmt?¡À¡Á?¡¤?¡ä?¦Ì?o¨®??¨º???¨º?D??¡é¡ä¨®D?¡ê??a¨¤?¨º?16¡Á??¨²?¡ê??¨º?D??¡é¨º?WAVEFORMATEX?¨¢11¦Ì??¡ã16??¡Á??¨²¡ê??¨°??¡ê???¡Á?3??¡§¨°?¨º¡À¨°??¨´¡ê?¨º?¡ã¨¹o?WAVEFORMAT?¨¢11¦Ì?PCMWAVEFORMAT?¨¢11?¡ê

nChannels¡Á???¦Ì??¦Ì¨º?1?¨°2¡ê?¡¤?¡Àe??¨®|¨®¨²¦Ì£¤¨¦¨´¦Ì¨¤o¨ª¨¢¡é¨¬?¨¦¨´?¡ênSamplesPerSec¡Á???¨º?????¦Ì??¨´¡À?¨ºy¡ê?¡À¨º¡Á??¦Ì¨º?????11,025?¡é22,050o¨ª44 100???¨´¡À??¡ênAvgBytesPerSec¡Á???¨º?¨¨??¨´?¨´?¨º¡ê?¦Ì£¤??¨º??????¨´¡À?¨ºy3?¨°?D?¦Ì¨¤¨ºy¡ê??¨´3?¨°?¨°????a¦Ì£¤??¦Ì??????¨´¡À?¦Ì?¡ä¨®D?¡ê?¨¨?o¨®3y¨°?82¡é¨ª¨´¨¦?¨¨???¨ºy?¡ê¡À¨º¡Á??¨´¡À?¡ä¨®D?¨º?8??o¨ª16???¡ênBlockAlign¡Á???¨º?D?¦Ì¨¤¨ºy3?¨°?¨°????a¦Ì£¤??¦Ì??¨´¡À?¡ä¨®D?¡ê?¨¨?o¨®3y¨°?82¡é¨ª¨´¨¦?¨¨???¨ºy?¡ê¡Á?o¨®¡ê?????¨º?¨°?wBitsPerSample¡Á????¨¢¨º?¡ê???¡Á???¨º?D?¦Ì¨¤¨ºy3?¨°?¨°????a¦Ì£¤??¦Ì??¨´¡À?¡ä¨®D??¡ê

??¨º?D??¡é¦Ì?o¨®??¨º???¡Á?¡Á?¡¤?¡ä??¡ãdata?¡À¡ê?¨¨?o¨®¨º?32??¦Ì?¨ºy?Y¡ä¨®D?¡ê?¡Á?o¨®¨º?2¡§D?¨ºy?Y¡À?¨¦¨ª?¡ê?aD?¨ºy?Y¨º?¡ã¡ä?¨¤¨ª???¨º???DD?¨°¦Ì£¤¨¢??¨¢¦Ì??¨´¡À?¡ê??a¨®?¦Ì¨ª?¡Á2¡§D?¨¦¨´¨°?¨¦¨¨¡À?¨¦??¨´¨º1¨®?¦Ì???¨º??¨¤¨ª??¡ê¨¨?1??¨´¡À?¡ä¨®D?¨º?8??¡ê??¨°???¨¹¨¦¨´¡ê????¡ä?????¨´¡À?¨®D1¡Á??¨²¨®?¨®¨²¦Ì£¤¨¦¨´¦Ì¨¤¡ê??¨°??¨®D2¡Á??¨²¨®?¨®¨²¨¢¡é¨¬?¨¦¨´?¡ê¨¨?1??¨´¡À?¡ä¨®D??¨²9¦Ì?16??????¡ê??¨°?????¨´¡À??¨ª¨®D2¡Á??¨²¨®?¨®¨²¦Ì£¤¨¦¨´¦Ì¨¤¡ê??¨°??4¡Á??¨²¨®?¨®¨²¨¢¡é¨¬?¨¦¨´?¡ê??¨®¨²¨¢¡é¨¬?¨¦¨´2¡§D?¨ºy?Y¡ê??????¨´¡À???¨®¨¦¡Á¨®?¦Ì?¡ã??o¨®??¦Ì?¨®¨°?¦Ì¡Á¨¦3¨¦?¡ê

??¨®¨²8???¨°2?¦Ì?8??¦Ì??¨´¡À?¡ä¨®D?¡ê??¨´¡À?¡Á??¨²¡À??a¨º¨ª?a?T?y?oo??¦Ì?¡ê¨¤y¨¨?¡ê???¨®¨²8??¦Ì??¨´¡À?¡ä¨®D?¡ê??2¨°?¦Ì¨¨¨®¨²0x80¡Á??¨²¦Ì?¡Á?¡¤?¡ä??¡ê??¨®¨²9???¨°?¨¹?¨¤¦Ì??¨´¡À?¡ä¨®D?¡ê??¨´¡À?¡À??a¨º¨ª?a¨®D?y?oo??¦Ì¡ê??a¨º¡À?2¨°?¦Ì?¡Á?¡¤?¡ä?¦Ì¨¨¨®¨²?¦Ì0?¡ê

¨®?¨®¨²?¨¢¨¨?¡À¨º?????t¦Ì?¨°?????¨°a1??¨°¨º?o???2?¡Á?¡À?¡ä|¨¤¨ª¦Ì?¨ºy?Y?¨¦?¡ê??1¨¹2¡§D?¨¦¨´¨°????tD¨¨¨°a?¡ãfmt?¡Ào¨ª?¡ãdata?¡À¡Á¨®¨ºy?Y?¨¦¡ê¡§¡ã¡ä??¡ä??3D¨°¡ê?¡ê?¦Ì??¨¹?1¡ã¨¹o????¨¹¡Á¨®¨ºy?Y?¨¦?¡ê¨®¨¨??¨º?¡ê?2¡§D?¨¦¨´¨°????t?¨¦?¨¹¡ã¨¹o?¨°???¡À¨º???a?¡ãINFO?¡À¦Ì?¡Á¨®¨ºy?Y?¨¦¡ê?o¨ª¨¬¨¢1?2¡§D?¨¦¨´¨°????tD??¡é¦Ì?¡Á¨®¨ºy?Y?¨¦¦Ì?¡Á¨®¨ºy?Y?¨¦?¡ê

¦Ì¨¹?¨®o?3¨¦¨º¦Ì?¨¦

D¨ª?¨¤?¨º¨¤¡ä?a?a?¨¢¨¦¨´¡ä¨®¡À?¡ä???¨¤-?1¦Ì??¨º¡ä¨²?e?a?a¨¨????¨ª¨°??-¨º?¨ª?¡¤???¨°?¦Ì¡Â?¡ê?e3?o???¡¤?3¡ê?¨°¦Ì£¤¡ê?¦Ì???o¨®?¨ª¡À?¦Ì??¡ä?¨®¨¢??¡ê¡À¡ì??¡ê??¨°?????¡ä¨°?D?¨°??-?¦Ì1y¦Ì?¨®D1?¨¦¨´¨°?¦Ì??¨º¨¬a?¡ê

¨°?¦Ì¡Â¡ê?3y¨¢?¨°?D?¡Á2?¡Â¨¦¨´¨°?¨ªa¡ê???¨®D¨¬?¨ºa¦Ì?¨°?¦Ì¡Â?¨°?¦Ì?¨º?¡ê?a???¦Ì?¨º?¨¦¨°??¨²¨¨?¨¤¨¤?¨¹1??D¨º¨¹¦Ì?¦Ì??¦Ì?¡Á¡¤??¡ì?¨²¡ê?¨°2?¨ª¨º?¡ä¨®20Hz¦Ì?20,000Hz¨°??¨²?¡ê¨¤y¨¨?¡ê????¨´¦Ì??¦Ì?¨º¡¤??¡ì?¨²27.5Hz¦Ì?4186Hz?????¡ê¨°?¦Ì¡Â¦Ì?¨¢¨ª¨°???¨¬??¡Â¨º?¨°?¨¢??¨°?¨¬?¨¨?¡ê?a¨®?2¨²¨¦¨²¨°?¦Ì¡Â¦Ì?2¡§D?¦Ì??¨´¨®D??¡¤¨´?¨¤??¨®|?¡ê?¨¬?¨¨¦Ì?¡À??¡¥¨®?¡¤?¡À¡ä?¨¨¨¢??¡ê?¨´???a?1¡ê?¨°??D??o¨¹o??¡ê

¨¨?o¨®¨®D¨°??t??¡ã¨¬¦Ì?¨º?3?¡Á??¡ã¨°??¨º?¡À?¡ê¡¤?3¡ê?¨°¦Ì£¤¡ê?¨°??¨º?¨ª¨º?¨¦¨´¨°?¦Ì?D??¨º¡ê?¨¤?¨®??¨¹¡ê??¨°???¨¦¨°???¡¤?¡ã¡ä?¨¤¨ª?¨°?¦Ì¡Â?¨¤¨ª?¨°?¨¢??Y¡Á¨¤¦Ì????¨´?¡éD?¨¬¨¢?¨´o¨ª¨¤?¡ã¨¨?¡ê

¡¤¡§1¨²¨ºy?¡ì?¨°Fourier¡¤¡é??¨°?D??¨¹?¨²D?¦Ì?2¡§D??a?a2????¨¤?¡ä?¡ä?¨®?a?a?¨¹?????¨¦¨°?¡À¨ª¨º??aD¨ª?¨¤?¦Ì?¨º¨º??¨´¡ä??¦Ì?¨º??¨ºy¡À?¦Ì??y?¨°2¡§D??¡ê?a???¨´¡ä??¦Ì?¨º¡ê?¨°23?¡Á¡Â¦Ì¨²¨°???D32¡§¡ê?¨º?2¡§D??¨¹?¨²¦Ì??¦Ì?¨º?¡ê¦Ì¨²¨°???¡¤o¨°?¡ê?¨°23?¡Á¡Â?t??D32¡§¡ê?¨º??¨´¡À??¦Ì?¨º¦Ì?¨¢?¡À?¡ê?¦Ì¨²?t??¡¤o¨°?¡ê??¨°??¨¨y??D32¡§¦Ì??¦Ì?¨º¨º??¨´¡À??¦Ì?¨º¦Ì?¨¨y¡À?¡ê?¨°¨¤¡ä?¨¤¨¤¨ª??¡êD32¡§??¡¤¨´¦Ì??¨¤?£¤1??¦ÌD?3¨¦¨¢?2¡§D?¦Ì?D?¡Á¡ä?¡ê

¨¤y¨¨?¡ê?¡¤?2¡§?¨¦¨°?¡À¨ª¨º??aD¨ª?¨¤¦Ì??y?¨°2¡§¡ê????D??¨ºyD32¡§¡ê¡§?¡ä2?¡é4?¡é6¦Ì¨¨¦Ì¨¨¡ê?¦Ì???¡¤¨´??¨º?0¡ê?????¨ºyD32¡§¡ê¡§?¡ä1?¡é3?¡é5¦Ì¨¨¦Ì¨¨¡ê?¦Ì???¡¤¨´??¡ã¡ä1?¡é1/3?¡é1/5¡À¨¨¨¤y¨°¨¤¡ä?¨¤¨¤¨ª??¡ê?¨²?a3Y2¡§?D¡ê??¨´¨®D¦Ì?¡¤o¨°???3???¡ê?????¡¤¨´??¡ã¡ä1?¡é1/2?¡é1/3?¡é1/4¡À¨¨¨¤y¨°¨¤¡ä?¨¤¨¤¨ª??¡ê

??¨®¨²¦Ì?1¨²???¡ì?¨°Hermann Helmholtz¡ê¡§1821-1894¡ê?¡ê??a¨º?¨¢??a¨°??¨º¦Ì?1??¨¹?¡ê?¨²??¦Ì???????On the Sensations of Tone?¡¤¡ê¡§1885?¨º¡ê?1954?¨º¨®¨¦Dover Press?¨´¡ã?¡ê??D¡ê?Helmholtz?¨´?¡§?¨²??o¨ª¡ä¨®?????¡ä?¨®¦Ì?¨¦¨´¨°?¡¤??a?a?y?¨°2¡§¡ê????aD??y?¨°2¡§?¨¤1?¦Ì????¨¨?¨ª¨º??¨°???¨´?D¨º¨¹¦Ì?¨°??¨º?¡ê2?D¨°¦Ì?¨º?¡ê?¨º??¨¦?1??¨®D?a?¡ä?¨°¦Ì£¤?¡ê

??¡Á?1968?¨ºWendy Carlos¦Ì?3a????Switched on Bach?¡¤¦Ì?¡¤¡é2?¡ê?¦Ì?¡Á¨®¨°?¨¤?o?3¨¦?¡Â¨°y?e¨¢?1??¨²¦Ì?1?¡¤o¡Á¡é¨°a?¡ê??¨º¡À¨º1¨®?¦Ì?o?3¨¦?¡Â¡ê¡§¨¤y¨¨?Moog¡ê?¨º??¡ê?ao?3¨¦?¡Â?¡ê?aD?o?3¨¦?¡Â¨º1¨®??¡ê?a¦Ì??¡¤¨¤¡ä2¨²¨¦¨²?¡Â??¨¦¨´¨°?2¡§D?¡ê?¨¤y¨¨?¡¤?2¡§?¡é¨¨y??2¡§D?o¨ª?a3Y2¡§D??¡ê¨°a¨º1?aD?2¡§D?¨¬y?e¨¤¡ä?¨¹????¨º¦Ì¦Ì?¨¤??¡Â¡ê??¨¹??¨¨???¨®¨²¦Ì£¤??¨°?¡¤?¦Ì?¡À??¡¥3¨¬D¨°?¡ê2¡§D?¦Ì??¨´¨®D??¡¤¨´¨°??¡ã¡ã¨¹??¡ê¡§envelope¡ê??¡ÀD?3¨¦?¡ê¦Ì¡À¨°?¡¤??a¨º?¨º¡À¡ê???¡¤¨´¨®¨¦0?a¨º????¨®¡ê?¨ª¡§3¡ê???¨®¡¤?3¡ê?¨¬?¡ê?a?¨ª¨º??¨´??¦Ì??e¡Á¨¤?¡ê¨¨?o¨®¦Ì¡À¨°?¡¤?3?D?¨º¡À¡ê???¡¤¨´¡À¡ê3??a3¡ê¨ºy¡ê??a¨º¡À3??a3?D??¡ê¨°?¡¤??¨¢¨º?¨º¡À¡ê???¡¤¨´?¦Ì?a0¡ê??a¨º¡À3??a¨º¨ª¡¤??¡ê

2¡§D?¨ª¡§1y??2¡§?¡Â¡ê???2¡§?¡Â???¡Â¨¨?¨°?D?D32¡§¡ê?2¡é???¨°¦Ì£¤2¡§D?¡Áa??¦Ì??¨¹?¡ä?¨®?¡é?¨¹¨®D¨¤??D?¡ê?aD???2¡§?¡Â¦Ì??D???¦Ì?¨º¨®¨¦¡ã¨¹??????¡ê?¨°?¡À?¨¦¨´¨°?¦Ì?D32¡§?¨²¨¨Y?¨²¨°?¡¤?¦Ì?3¨¬D¨°?D??¡À??¡ê

¨°¨°?a?aD?o?3¨¦?¡Â¨°?¡¤¨¢??¦Ì?2¡§D???¨º?¦Ì¡Âo¨ª?a¨º?¡ê????¨°¨°?D?D32¡§¨ª¡§1y??2¡§?¡Â??DD¨¢??¡Â¨¨?¡ê??a??D?¨º?¦Ì?o?3¨¦3??a?¡ã?oo?3¨¦?¡À?¡ê

?¡ä¨º1?¨²?oo?3¨¦?¨²??¡ê?D¨ª?¨¤¨¨?¨°2?1?¨¢?¨²¦Ì?¡Á¨®¨°?¨¤??D¡¤¡é??¦Ì¨¹?¨®o?3¨¦¨º???¨°???¡ä¨®?¨º¨¬a?¡ê

?¨²¦Ì¨¹?¨®o?3¨¦?D¡ê??¨²?¨¦¨°?¡ä¨®D¨ª?¨¤??¨ºy¡À??y?¨°2¡§¨¦¨²3¨¦?¡Â?a¨º?¡ê???????¨ºy¡À?¨°?¡À?¨®¨²?????y?¨°2¡§????¨®|¨°???D32¡§?¡ê????D32¡§¦Ì???¡¤¨´??¨®¨¦¨°???¡ã¨¹??¦Ì£¤?¨¤?????¡ê¨º1¨®??¡ê?a¦Ì??¡¤¦Ì?¦Ì¨¹?¨®o?3¨¦2?¨º¦Ì¨®?¡ê?¨°¨°?a??¦Ì£¤??¨°?¡¤??¨ªD¨¨¨°a8o¨ª24????¨ºy??¦Ì??y?¨°2¡§¨¦¨²3¨¦?¡Â¡ê???¨®??aD??y?¨°2¡§¨¦¨²3¨¦?¡Â?¨¤1?¦Ì??¦Ì?¨º¡À?D???¨¨¡¤¦Ì??£¤?¨¤?????¡ê?¡ê?a2¡§D?¨¦¨²3¨¦?¡Â?¨¨?¡§D?o¨¹2?¡ê????¨°¨¨Y¨°¡Á¡¤¡é¨¦¨²?¦Ì?¨º?¡¥¨°??¡ê

2?1y¡ê?¨®¨¦¨ºy¡Á?o?3¨¦?¡Â¡ê¡§?¨¦¨°?¨ºy¡Á??¡¥¦Ì?¨º1¨®?????¡À¨ª2¨²¨¦¨²2¡§D?¡ê?o¨ª?????¨²2¨²¨¦¨²¦Ì?2¡§D?¡ê??¦Ì?¨º?¡¥¨°?2¡é2?¨º????¨º¨¬a¡ê?¨°¨°??¦Ì¨¹?¨®o?3¨¦¨°2?¨ª?D¨º¦Ì?¨¦DD¨¢??¡ê¨°¨°¡ä?¡Á¨¹¦Ì?¨¤¡ä?¦Ì¡êo?¨²??????¨º¦Ì¦Ì?¨¤??¨²¨º¡À¡ê??¨¦¨°?¨®?Fourier¡¤??a¡¤¡§????¡¤??a3¨¦?¨¤??D32¡§?¡ê¨¨?o¨®?¨ª?¨¦¨°?¨¨¡¤?¡§????D32¡§¦Ì??¨¤?????¨¨¡ê??¨´¨®??¨¤???y?¨°2¡§¨ºy¡Á??¡¥¦Ì?2¨²¨¦¨²¨¦¨´¨°??¡ê

¨¨?1??a¨º?¨º¦Ì?¨¦¨º¡À¨®?Fourier¡¤???¡¤¡§¡¤???¨º¦Ì?¨º¦Ì?¨°?¦Ì¡Â¡ê?2¡é¡ä¨®?¨¤???y?¨°2¡§¨¤¡ä2¨²¨¦¨²?aD?¨°?¦Ì¡Â¡ê????¡ä¨¨?????¡¤¡é??¨°??¨º2¡é2???Helmholtz?¨´¨¨??a¦Ì????¨´?¨°¦Ì£¤?¡ê

¡Á?¡ä¨®¦Ì??¨º¨¬a¨º???¨º¦Ì¨°?¦Ì¡Â¦Ì?D32¡§????2¡é??¨®D??¨¨¡¤¦Ì???¨ºy1??¦Ì?¡ê¨º?¨º¦Ì¨¦?¡ê??¡ãD32¡§?¡À¨°?¡ä¨º??¨®¨²¨º¦Ì?¨º¦Ì?¨°?¦Ì¡Â¨¤¡ä?¦Ì2¡é2?¨º?¡¤?¨º¨º¦Ì¡À?¡ê?¡Â???y?¨°2¡§¡Á¨¦3¨¦??2?o¨ªD3¡ê??¨°???¨¹¡Á?¨¨¡¤¦Ì??¦Ì¨º??¡ã¡¤o¨°??¡À?¡ê

¨¨???¡¤¡é??¡ê?¨º¦Ì?¨º¨°?¦Ì¡Â¡¤o¨°?????¦Ì?2?o¨ªD3?¨²¡ä¡ä?¨¬?¡ã??¨º¦Ì¦Ì??¡À¨¦¨´¨°?¨º¡Ào¨¹??¨°a?¡ê?2¨¬?o¨ªD3?¨¢2¨²¨¦¨²?¡ã¦Ì?¨¢¡Â?¡À¨¦¨´?¡ê????¡¤o¨°????¨²¦Ì£¤??¨°?¡¤?¨¦???¡À???¡¤¨´o¨ª?¦Ì?¨º?¡ê¡¤o¨°??D¡ê??¨¤???¦Ì?¨ºo¨ª??¡¤¨´¦Ì?1??¦Ì??¨®¨²2?¨ª?¦Ì?¡¤o¨°?¨°??¡ã¨¤¡ä¡Á??¨¤¨ª?¨¤??¡Â¦Ì?2?¨ª????¨¨¨º?2?¨ª?¦Ì??¡ê¨º¦Ì?¨º¨°?¦Ì¡Â?D¡Á??¡ä?¨®¦Ì?2?¡¤?¡¤¡é¨¦¨²?¨²¨°?¡¤?¦Ì??e¡Á¨¤2?¡¤?¡ê??a¨º¡À¡À¨¨??2?o¨ªD3?¡ê¨¨???¡¤¡é??¨°?¡¤?¦Ì??a???¡ä?¨®¦Ì??e¡Á¨¤??????¨®¨²¨¨?¨¤¨¤?D¨º¨¹¨°??¨ºo¨¹??¨°a?¡ê

?¨°??????¡ê?¨º¦Ì?¨º¨¤??¡Â¦Ì?¨¦¨´¨°?¡À¨¨¨¨?o????¨®¦Ì????¨¹?¡ä?¨®?¡ê¡¤???¨°?¦Ì¡Â¦Ì?1?¦Ì?¡ê?¨°??¡ão¨®??¨®?¨®¨²????¡¤o¨°?¦Ì???¡¤¨´o¨ª?¦Ì?¨º¦Ì??¨¤???¨°¦Ì£¤¦Ì?¡ã¨¹??1?¦Ì???¨¨???2?¨º¦Ì¨®??¡ê

¨º¦Ì?¨º¨¤??¨²¦Ì?¨°?D?¡¤???¡¤¡§¡¤¡é¡À¨ª¨®¨²???¨²¡ê¡§1977¦Ì?1978?¨º??¡ê?¦Ì???Computer Music Journal?¡¤¡ê¡§¦Ì¡À¨º¡À¨®¨¦People's Computer Company¡¤¡éDD¡ê????¨²¨®¨¦MIT Press¡¤¡éDD¡ê?¨®¨¦James A. Moorer?¡éJohn Greyo¨ªJohn Strawn Some¡À¨¤D¡ä¨¢?¦Ì¨²¨¨y2?¡¤?¡ä?¨º¨¦??Lexicon of Analyzed Tones?¡¤¡ê???¨º¨¦??¨º?¨¢??¨²D?¨¬¨¢?¨´?¡é???¨¦1¨¹?¡é¦Ì£¤?¨¦1¨¹o¨ª¨¤?¡ã¨¨¨¦??Y¡Á¨¤¨°???¨°?¡¤?¡ê¡§D?¨®¨²¡ã?????¡ê?¦Ì?¡¤o¨°?¦Ì???¡¤¨´o¨ª?¦Ì?¨º¨ª?D??¡ê?¨´¨®?¦Ì?¨°?¡¤?¨º??D¨°?C¨¦?¦Ì??¦ÌE?¡êD?¨¬¨¢?¨´¨®?20??¡¤o¨°?¡ê????¨¦1¨¹o¨ª¦Ì£¤?¨¦1¨¹¨®?21??¡ê???¨¤?¡ã¨¨¨®?12???¡ê¨º¦Ì?¨º¨¦?¡ê???Computer Music Journal?¡¤¦Ì?Volume II?¡éNumber 2¡ê¡§1978?¨º9??¡ê?¡ã¨¹o?¨¢?¨®?????¨¤¡ä?¨¹?????¨¦1¨¹?¡é¦Ì£¤?¨¦1¨¹o¨ª¨¤?¡ã¨¨¦Ì?2?¨ª??¦Ì?¨ºo¨ª??¡¤¨´¦Ì?¡ã¨¹???¡ê

¨°¨°¡ä?¡ê?¨¤?¨®?Windows¨¦??¡ì3?¦Ì?¨¦¨´¨°?2¡§D?1|?¨¹¡ê?????¦Ì?3¨¬D¨°o¨¹?¨°¦Ì£¤¡êo???aD?¨ºy¡Á??¨¹¨¨?3¨¬D¨°?¡é?a????¡¤o¨°???2¨²¨¦¨²?¨¤???y?¨°2¡§?¨´¡À??¡é¨¬¨ª?¨®?aD??¨´¡À?2¡é????¡¤¡é?¨ª??2¡§D?¨¦¨´¨°?¨¦¨´?¡§¡ê?¨°¨°¡ä?¡ã?20?¨º?¡ã?-¨º?????¦Ì?¨¦¨´¨°???D????¨¬3?¨¤¡ä¨°2o¨¹¨¨Y¨°¡Á?¡êADDSYNTH¡ê¡§?¡ã¦Ì¨¹?¨®o?3¨¦?¡À¡ê?¨¨?3¨¬D¨°22-6?¨´¨º??¡ê

 3¨¬D¨°22-6  ADDSYNTH
ADDSYNTH.C /*-------------------------------------------------------------------------- ADDSYNTH.C -- Additive Synthesis Sound Generation (c) Charles Petzold, 1998 ---------------------------------------------------------------------------*/ #include <windows.h> #include <math.h> #include "addsynth.h" #include "resource.h" #define ID_TIMER 1 #define SAMPLE_RATE 22050 #define MAX_PARTIALS 21 #define PI 3.14159 BOOL CALLBACK DlgProc (HWND, UINT, WPARAM, LPARAM) ; TCHAR szAppName [] = TEXT ("AddSynth") ; // Sine wave generator // ------------------- double SineGenerator (double dFreq, double * pdAngle) { double dAmp ; dAmp = sin (* pdAngle) ; * pdAngle += 2 * PI * dFreq / SAMPLE_RATE ; if (* pdAngle >= 2 * PI) * pdAngle -= 2 * PI ; return dAmp ; } // Fill a buffer with composite waveform // ------------------------------------- VOID FillBuffer (INS ins, PBYTE pBuffer, int iNumSamples) { static double dAngle [MAX_PARTIALS] ; double dAmp, dFrq, dComp, dFrac ; int i, iPrt, iMsecTime, iCompMaxAmp, iMaxAmp, iSmp ; // Calculate the composite maximum amplitude iCompMaxAmp = 0 ; for (iPrt = 0 ; iPrt < ins.iNumPartials ; iPrt++) { iMaxAmp = 0 ; for (i = 0 ; i < ins.pprt[iPrt].iNumAmp ; i++) iMaxAmp = max (iMaxAmp, ins.pprt[iPrt].pEnvAmp[i].iValue) ; iCompMaxAmp += iMaxAmp ; } // Loop through each sample for (iSmp = 0 ; iSmp < iNumSamples ; iSmp++) { dComp = 0 ; iMsecTime = (int) (1000 * iSmp / SAMPLE_RATE) ; // Loop through each partial for (iPrt = 0 ; iPrt < ins.iNumPartials ; iPrt++) { dAmp = 0 ; dFrq = 0 ; for (i = 0 ; i < ins.pprt[iPrt].iNumAmp - 1 ; i++) { if (iMsecTime >= ins.pprt[iPrt].pEnvAmp[i ].iTime && iMsecTime <= ins.pprt[iPrt].pEnvAmp[i+1].iTime) { dFrac = (double) (iMsecTime - ins.pprt[iPrt].pEnvAmp[i ].iTime) / (ins.pprt[iPrt].pEnvAmp[i+1].iTime - ins.pprt[iPrt].pEnvAmp[i ].iTime) ; dAmp = dFrac * ins.pprt[iPrt].pEnvAmp[i+1].iValue + (1-dFrac) * ins.pprt[iPrt].pEnvAmp[i ].iValue ; break ; } } for (i = 0 ; i < ins.pprt[iPrt].iNumFrq - 1 ; i++) { if (iMsecTime >= ins.pprt[iPrt].pEnvFrq[i ].iTime && iMsecTime <= ins.pprt[iPrt].pEnvFrq[i+1].iTime) { dFrac = (double) (iMsecTime -ins.pprt[iPrt].pEnvFrq[i ].iTime) / (ins.pprt[iPrt].pEnvFrq[i+1].iTime - ins.pprt[iPrt].pEnvFrq[i ].iTime) ; dFrq = dFrac * ins.pprt[iPrt].pEnvFrq[i+1].iValue + (1-dFrac) * ins.pprt[iPrt].pEnvFrq[i ].iValue ; break ; } } dComp += dAmp * SineGenerator (dFrq, dAngle + iPrt) ; } pBuffer[iSmp] = (BYTE) (127 + 127 * dComp / iCompMaxAmp) ; } } // Make a waveform file // ------------------------------------------------------------------------- BOOL MakeWaveFile (INS ins, TCHAR * szFileName) { DWORD dwWritten ; HANDLE hFile ; int iChunkSize, iPcmSize, iNumSamples ; PBYTE pBuffer ; WAVEFORMATEX waveform ; hFile = CreateFile (szFileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL) ; if (hFile == NULL) return FALSE ; iNumSamples = ((long) ins.iMsecTime * SAMPLE_RATE / 1000 + 1) / 2 * 2 ; iPcmSize = sizeof (PCMWAVEFORMAT) ; iChunkSize = 12 + iPcmSize + 8 + iNumSamples ; if (NULL == (pBuffer = malloc (iNumSamples))) { CloseHandle (hFile) ; return FALSE ; } FillBuffer (ins, pBuffer, iNumSamples) ; waveform.wFormatTag = WAVE_FORMAT_PCM ; waveform.nChannels = 1 ; waveform.nSamplesPerSec = SAMPLE_RATE ; waveform.nAvgBytesPerSec = SAMPLE_RATE ; waveform.nBlockAlign = 1 ; waveform.wBitsPerSample = 8 ; waveform.cbSize = 0 ; WriteFile (hFile, "RIFF", 4, &dwWritten, NULL) ; WriteFile (hFile, &iChunkSize, 4, &dwWritten, NULL) ; WriteFile (hFile, "WAVEfmt ", 8, &dwWritten, NULL) ; WriteFile (hFile, &iPcmSize, 4, &dwWritten, NULL) ; WriteFile (hFile, &waveform, sizeof (WAVEFORMATEX) - 2, &dwWritten, NULL) ; WriteFile (hFile, "data", 4, &dwWritten, NULL) ; WriteFile (hFile, &iNumSamples, 4, &dwWritten, NULL) ; WriteFile (hFile, pBuffer, iNumSamples, &dwWritten, NULL) ; CloseHandle (hFile) ; free (pBuffer) ; if ((int) dwWritten != iNumSamples) { DeleteFile (szFileName) ; return FALSE ; } return TRUE ; } void TestAndCreateFile ( HWND hwnd, INS ins, TCHAR * szFileName, int idButton) { TCHAR szMessage [64] ; if (-1 != GetFileAttributes (szFileName)) EnableWindow (GetDlgItem (hwnd, idButton), TRUE) ; else { if (MakeWaveFile (ins, szFileName)) EnableWindow (GetDlgItem (hwnd, idButton), TRUE) ; else { wsprintf (szMessage, TEXT ("Could not create %x."), szFileName) ; MessageBeep (MB_ICONEXCLAMATION) ; MessageBox (hwnd, szMessage, szAppName, MB_OK | MB_ICONEXCLAMATION) ; } } } int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { if (-1 == DialogBox (hInstance, szAppName, NULL, DlgProc)) { MessageBox ( NULL, TEXT ("This program requires Windows NT!"), szAppName, MB_ICONERROR) ; } return 0 ; } BOOL CALLBACK DlgProc ( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { static TCHAR * szTrum = TEXT ("Trumpet.wav") ; static TCHAR * szOboe = TEXT ("Oboe.wav") ; static TCHAR * szClar = TEXT ("Clarinet.wav") ; switch (message) { case WM_INITDIALOG: SetTimer (hwnd, ID_TIMER, 1, NULL) ; return TRUE ; case WM_TIMER: KillTimer (hwnd, ID_TIMER) ; SetCursor (LoadCursor (NULL, IDC_WAIT)) ; ShowCursor (TRUE) ; TestAndCreateFile (hwnd, insTrum, szTrum, IDC_TRUMPET) ; TestAndCreateFile (hwnd, insOboe, szOboe, IDC_OBOE) ; TestAndCreateFile (hwnd, insClar, szClar, IDC_CLARINET) ; SetDlgItemText (hwnd, IDC_TEXT, TEXT (" ")) ; SetFocus (GetDlgItem (hwnd, IDC_TRUMPET)) ; ShowCursor (FALSE) ; SetCursor (LoadCursor (NULL, IDC_ARROW)) ; return TRUE ; case WM_COMMAND: switch (LOWORD (wParam)) { case IDC_TRUMPET: PlaySound (szTrum, NULL, SND_FILENAME | SND_SYNC) ; return TRUE ; case IDC_OBOE: PlaySound (szOboe, NULL, SND_FILENAME | SND_SYNC) ; return TRUE ; case IDC_CLARINET: PlaySound (szClar, NULL, SND_FILENAME |SND_SYNC) ; return TRUE ; } break ; case WM_SYSCOMMAND: switch (LOWORD (wParam)) { case SC_CLOSE: EndDialog (hwnd, 0) ; return TRUE ; } break ; } return FALSE ; }
 ADDSYNTH.RC ¡ê¡§?a??¡ê?
//Microsoft Developer Studio generated resource script. #include "resource.h" #include "afxres.h" ///////////////////////////////////////////////////////////////////////////// // Dialog ADDSYNTH DIALOG DISCARDABLE 100, 100, 176, 49 STYLE WS_MINIMIZEBOX | WS_CAPTION | WS_SYSMENU CAPTION "Additive Synthesis" FONT 8, "MS Sans Serif" BEGIN PUSHBUTTON "Trumpet",IDC_TRUMPET,8,8,48,16 PUSHBUTTON "Oboe",IDC_OBOE,64,8,48,16 PUSHBUTTON "Clarinet",IDC_CLARINET,120,8,48,16 LTEXT "Preparing Data...",IDC_TEXT,8,32,100,8 END
 RESOURCE.H ¡ê¡§?a??¡ê?
// Microsoft Developer Studio generated include file. // Used by AddSynth.rc #define IDC_TRUMPET 1000 #define IDC_OBOE 1001 #define IDC_CLARINET 1002 #define IDC_TEXT 1003

?a¨¤???¨®D??3????¨®???tADDSYNTH.H¡ê?¨°¨°?a?¨¹¡ã¨¹o???¡ã¨´DD¨¢?¨¨?¨¬??¨¢¦Ì?De¨º?¡ê??¨²???¨²¡À?¨º¨¦??¨¦?¦Ì?1a?¨¬¨¦??¨°¦Ì??¨¹?¡ê?¨²ADDSYNTH.H¦Ì??a¨º?????¡ê??¨°?¡§¨°?¨¢?¨¨y???¨¢11¡ê?¨®?¨®¨²¡ä¡é¡ä?¡ã¨¹??¨ºy?Y?¡ê??????¡¤¨´o¨ª?¦Ì?¨º¡¤?¡Àe¡ä¡é¡ä?¦Ì?D¨ª¨¬?ENV¦Ì??¨¢11¨ºy¡Á¨¦?D?¡ê?aD?¨ºy¡Á???¨®¨¦¨º¡À??¡ê¡§o¨¢??¡ê?o¨ª??¡¤¨´?¦Ì¡ê¡§¡ã¡ä¨¨?¨°a?¨¨¨¢?¦Ì£¤??¡ê??¨°?¦Ì?¨º¡ê¡§¨°??¨¹?¨²/???a¦Ì£¤??¡ê?¡Á¨¦3¨¦?¡ê?aD?¨ºy¡Á¨¦¦Ì?3¡è?¨¨?¨¦¡À?¡ê???¡À??¡¥¡¤??¡ì¡ä¨®6¦Ì?14?¡ê?¨´?¡§??¡¤¨´o¨ª?¦Ì?¨º?¦Ì?????¡À?¨®?¨¤1??¡ê

????¨¤??¡Â??¡ã¨¹¨¤¡§¨°???¡¤o¨°??¡¥¡ê¡§¨¤?¡ã¨¨¨®?12??¡ê????¨¦1¨¹o¨ª¦Ì£¤?¨¦1¨¹¡¤?¡Àe¨º1¨®?21??¡ê?¡ê??aD?¡¤o¨°??¡¥¡ä¡é¡ä??¨²D¨ª¨¬?PRT¦Ì??¨¢11¨ºy¡Á¨¦?D?¡êPRT?¨¢11¡ä¡é¡ä???¡¤¨´o¨ª?¦Ì?¨º¡ã¨¹??¦Ì?¦Ì?¨ºy¡ê?¨°??¡ã???¨°ENV¨ºy¡Á¨¦¦Ì??????¡êINS?¨¢11¡ã¨¹¨¤¡§¨°?¦Ì¡Â¦Ì?¡Á¨¹¨º¡À??¡ê¡§¨°?o¨¢???a¦Ì£¤??¡ê??¡é¡¤o¨°?¨ºy¨°??¡ã???¨°¡ä¡é¡ä?¡¤o¨°?¦Ì?PRT¨ºy¡Á¨¦¦Ì??????¡ê

ADDSYNTH¨®D¨¨y??¡À¨º???a?¡ãTrumpet?¡À?¡é?¡ãOboe?¡Ào¨ª?¡ãClarinet?¡À¦Ì?¡ã¡ä?£¤?¡êPC¦Ì??¨´?¨¨?1??¨®D?¨¬¦Ì?¡Á?¨°?¨º¦Ì¨º¡À?????¨´¨®D¦Ì?¦Ì¨¹?¨®o?3¨¦¡ê?¨°¨°¡ä?¦Ì¨²¨°?¡ä???DDADDSYNTH¨º¡À¡ê??aD?¡ã¡ä?£¤??¨º¡ìD¡ì¡ê??¡À¦Ì?3¨¬D¨°????¨ª¨º?¨´¡À?2¡é?¡§¨¢¡é¨¢?TRUMPET.WAV?¡éOBOE.WAVo¨ªCLARINET.WAV¨¦¨´¨°????to¨®¡ê?¡ã¡ä?£¤2????¡¥¡ê????¨°?¨¦¨°?¨º1¨®?PlaySoundo¡¥¨ºy2£¤¡¤??a¨¨y??¨¦¨´¨°??¡ê??¡ä???DD¨º¡À¡ê?3¨¬D¨°???¨¬2¨¦2¡§D????t¨º?¡¤?¡ä??¨²¡ê???2?D¨¨??D??¡§¨¢¡é?¡ê

ADDSYNTH?D¦Ì?FillBuffero¡¥¨ºy¨ª¨º3¨¦¨¢?¡ä¨®?¨¤¨ºy1¡è¡Á¡Â?¡êFillBuffer¡ä¨®????o?3¨¦¡Á?¡ä¨®??¡¤¨´¦Ì?¡Á¨¹¨ºy?a¨º??¡ê?a¡ä?¡ê??¨¹?¨²¨¤??¡Â¦Ì?¡¤o¨°??D?-?¡¤¡ê?¨°??¨°3?????¡¤o¨°?¦Ì?¡Á?¡ä¨®??¡¤¨´¡ê?¨¨?o¨®???¨´¨®D¦Ì?¡Á?¡ä¨®??¡¤¨´?¨®?e¨¤¡ä?¡ê¡ä??¦Ìo¨®¨¤¡ä¨®?¨®¨²???¨´¡À???¡¤?¦Ì?8??¦Ì??¨´¡À?¡ä¨®D??¡ê

¨¨?o¨®FillBuffer?????????¨´¡À?¦Ì??¦Ì?¡ê?????¨´¡À?????¨®|¨®¨²¨°???¨°?o¨¢???a¦Ì£¤??¦Ì?¨º¡À??¡ê???¨º¡À??¨¨???¨®¨²¨¨??¨´?¦Ì?¨º¡ê¡§¨º¦Ì?¨º¨¦?¡ê??¨²22.05 kHz¦Ì?¨¨??¨´?¦Ì?¨º??¡ê???22???¨´¡À???¨®|¨®¨²?¨¤¨ª?¦Ì?o¨¢??¨º¡À???¦Ì¡ê??¡ê¨¨?o¨®¡ê?FillBuffer?¨²¡¤o¨°??D?-?¡¤?¡ê??¨®¨²?¦Ì?¨ºo¨ª??¡¤¨´¡ê??¨¹?¨°3?¨®?o¨¢??¨º¡À???¦Ì??¨®|¦Ì?¡ã¨¹??????¡ê?2¡é??DD??D?2?21?¡ê

?¦Ì?¨º?¦Ì¨®??¨¤?????¦Ì¨°??e¡ä?¦ÌY??SineGeneratoro¡¥¨ºy?¡ê¡À????¡ã??¨¬???1y¡ê?2¨²¨¦¨²¨ºy¡Á??¡¥¦Ì??y?¨°2¡§D?D¨¨¨°a¡À¡ê3??¨¤?????¦Ì¡ê?2¡é¨°¨¤?Y?¦Ì?¨º?¦Ì???¨®?¡ê¡ä¨®SineGeneratoro¡¥¨ºy¡ä???¨º¡À¡ê??y?¨°?¦Ì??3?¨°?¡¤o¨°?¦Ì???¡¤¨´2¡é¨¤??¨®?¡ê?¨´¡À?¦Ì??¨´¨®D¡¤o¨°????¨®?¨²?e¨¤¡ä??o¨®¡ê??¨´¡À??¨ª??¡¤?¦Ì?¡Á??¨²¡ä¨®D??¡ê

?e¡ä2o?2¡§D?¨¦¨´¨°?

WAKEUP¡ê?¨¨?3¨¬D¨°22-7?¨´¨º?¡ê?¨º??¡ä¡ä¨²?????t?¡ä?e¨¤¡ä2?¨º?o¨¹¨ª¨º??¦Ì?3¨¬D¨°??¨°??¡ê3¨¬D¨°¡ä¡ã?¨²?¡ä?e¨¤¡ä?????¡ã?¨°¡ê?¦Ì?¨º???¨®D¡Á¨º?¡ä?¨¨¨º?¦Ì¦Ì¡ê¡§?¨°??¨°??-?a¦Ì¨¤¨¨?o?¡À¨¤D¡ä¡ê?¡ê?2¡é?¨°3¨¬D¨°¨º1¨®?¨°???2¡§D????t¡ê?¦Ì??¨²1a?¨¬¨¦?¨¨¡ä??¨®D?a?¨´¦Ì????t?¡ê2?1y¡ê?3¨¬D¨°¡¤?3¡ê¨®D¨¨¡è¡êo?¨¹2£¤¡¤?¦Ì?¨¦¨´¨°?o¨¹¡ä¨®¡ê?2¡é?¨°¡¤?3¡ê¨¢?¨¨?¨¬??¨¢?¡êWAKEUP¨º??¨°¦Ì????¨®¡ê??¨¹1???D??¨°?¨¬D?1¡è¡Á¡Â?¡ê

 3¨¬D¨°22-7  WAKEUP
WAKEUP.C /*--------------------------------------------------------------------------- WAKEUP.C -- Alarm Clock Program (c) Charles Petzold, 1998 ---------------------------------------------------------------------------*/ #include <windows.h> #include <commctrl.h> // ID values for 3 child windows #define ID_TIMEPICK 0 #define ID_CHECKBOX 1 #define ID_PUSHBTN 2 // Timer ID #define ID_TIMER 1 // Number of 100-nanosecond increments (ie FILETIME ticks) in an hour #define FTTICKSPERHOUR (60 * 60 * (LONGLONG) 10000000) // Defines and structure for waveform "file" #define SAMPRATE 11025 #define NUMSAMPS (3 * SAMPRATE) #define HALFSAMPS (NUMSAMPS / 2) typedef struct { char chRiff[4] ; DWORD dwRiffSize ; char chWave[4] ; char chFmt [4] ; DWORD dwFmtSize ; PCMWAVEFORMAT pwf ; char chData[4] ; DWORD dwDataSize ; BYTE byData[0] ; } WAVEFORM ; // The window proc and the subclass proc LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ; LRESULT CALLBACK SubProc (HWND, UINT, WPARAM, LPARAM) ; // Original window procedure addresses for the subclassed windows WNDPROC SubbedProc [3] ; // The current child window with the input focus HWND hwndFocus ; int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInst, PSTR szCmdLine, int iCmdShow) { static TCHAR szAppName [] = TEXT ("WakeUp") ; HWND hwnd ; MSG msg ; WNDCLASS wndclass ; wndclass.style = 0 ; wndclass.lpfnWndProc = WndProc ; wndclass.cbClsExtra = 0 ; wndclass.cbWndExtra = 0 ; wndclass.hInstance = hInstance ; wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ; wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ; wndclass.hbrBackground = (HBRUSH) (1 + COLOR_BTNFACE) ; wndclass.lpszMenuName = NULL ; wndclass.lpszClassName = szAppName ; if (!RegisterClass (&wndclass)) { MessageBox ( NULL, TEXT ("This program requires Windows NT!"), szAppName, MB_ICONERROR) ; return 0 ; } hwnd = CreateWindow ( szAppName, szAppName, WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL) ; ShowWindow (hwnd, iCmdShow) ; UpdateWindow (hwnd) ; while (GetMessage (&msg, NULL, 0, 0)) { TranslateMessage (&msg) ; DispatchMessage (&msg) ; } return msg.wParam ; } LRESULT CALLBACK WndProc ( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { static HWND hwndDTP, hwndCheck, hwndPush ; static WAVEFORM waveform = { "RIFF", NUMSAMPS + 0x24, "WAVE", "fmt ", sizeof (PCMWAVEFORMAT), 1, 1, SAMPRATE, SAMPRATE, 1, 8, "data", NUMSAMPS } ; static WAVEFORM * pwaveform ; FILETIME ft ; HINSTANCE hInstance ; INITCOMMONCONTROLSEX icex ; int i, cxChar, cyChar ; LARGE_INTEGER li ; SYSTEMTIME st ; switch (message) { case WM_CREATE: // Some initialization stuff hInstance = (HINSTANCE) GetWindowLong (hwnd, GWL_HINSTANCE) ; icex.dwSize = sizeof (icex) ; icex.dwICC = ICC_DATE_CLASSES ; InitCommonControlsEx (&icex) ; // Create the waveform file with alternating square waves pwaveform = malloc (sizeof (WAVEFORM) + NUMSAMPS) ; * pwaveform = waveform ; for (i = 0 ; i < HALFSAMPS ; i++) if (i % 600 < 300) if (i % 16 < 8) pwaveform->byData[i] = 25 ; else pwaveform->byData[i] = 230 ; else if (i % 8 < 4) pwaveform->byData[i] = 25 ; else pwaveform->byData[i] = 230 ; // Get character size and set a fixed window size. cxChar = LOWORD (GetDialogBaseUnits ()) ; cyChar = HIWORD (GetDialogBaseUnits ()) ; SetWindowPos ( hwnd, NULL, 0, 0, 42 * cxChar, 10 * cyChar / 3 + 2 * GetSystemMetrics (SM_CYBORDER) +GetSystemMetrics (SM_CYCAPTION) ,SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE) ; // Create the three child windows hwndDTP = CreateWindow (DATETIMEPICK_CLASS, TEXT (""), WS_BORDER | WS_CHILD | WS_VISIBLE | DTS_TIMEFORMAT, 2 * cxChar, cyChar, 12 * cxChar, 4 * cyChar / 3, hwnd, (HMENU) ID_TIMEPICK, hInstance, NULL) ; hwndCheck = CreateWindow (TEXT ("Button"), TEXT ("Set Alarm"), WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX, 16 * cxChar, cyChar, 12 * cxChar, 4 * cyChar / 3, hwnd, (HMENU) ID_CHECKBOX, hInstance, NULL) ; hwndPush = CreateWindow (TEXT ("Button"), TEXT ("Turn Off"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | WS_DISABLED, 28 * cxChar, cyChar, 12 * cxChar, 4 * cyChar / 3, hwnd, (HMENU) ID_PUSHBTN, hInstance, NULL) ; hwndFocus = hwndDTP ; // Subclass the three child windows SubbedProc [ID_TIMEPICK] = (WNDPROC) SetWindowLong (hwndDTP, GWL_WNDPROC, (LONG) SubProc) ; SubbedProc [ID_CHECKBOX] = (WNDPROC) SetWindowLong (hwndCheck, GWL_WNDPROC, (LONG) SubProc); SubbedProc [ID_PUSHBTN] = (WNDPROC) SetWindowLong (hwndPush, GWL_WNDPROC, (LONG) SubProc) ; // Set the date and time picker control to the current time // plus 9 hours, rounded down to next lowest hour GetLocalTime (&st) ; SystemTimeToFileTime (&st, &ft) ; li = * (LARGE_INTEGER *) &ft ; li.QuadPart += 9 * FTTICKSPERHOUR ; ft = * (FILETIME *) &li ; FileTimeToSystemTime (&ft, &st) ; st.wMinute = st.wSecond = st.wMilliseconds = 0 ; SendMessage (hwndDTP, DTM_SETSYSTEMTIME, 0, (LPARAM) &st) ; return 0 ; case WM_SETFOCUS: SetFocus (hwndFocus) ; return 0 ; case WM_COMMAND: switch (LOWORD (wParam)) // control ID { case ID_CHECKBOX: // When the user checks the "Set Alarm" button, get the // time in the date and time control and subtract from // it the current PC time. if (SendMessage (hwndCheck, BM_GETCHECK, 0, 0)) { SendMessage (hwndDTP, DTM_GETSYSTEMTIME, 0, (LPARAM) &st) ; SystemTimeToFileTime (&st, &ft) ; li = * (LARGE_INTEGER *) &ft ; GetLocalTime (&st) ; SystemTimeToFileTime (&st, &ft) ; li.QuadPart -= ((LARGE_INTEGER *) &ft)->QuadPart ; // Make sure the time is between 0 and 24 hours! // These little adjustments let us completely ignore // the date part of the SYSTEMTIME structures. while ( li.QuadPart < 0) li.QuadPart += 24 * FTTICKSPERHOUR ; li.QuadPart %= 24 * FTTICKSPERHOUR ; // Set a one-shot timer! (See you in the morning.) SetTimer (hwnd, ID_TIMER, (int) (li.QuadPart / 10000), 0) ; } // If button is being unchecked, kill the timer. else KillTimer (hwnd, ID_TIMER) ; return 0 ; // The "Turn Off" button turns off the ringing alarm, and also // unchecks the "Set Alarm" button and disables itself. case ID_PUSHBTN: PlaySound (NULL, NULL, 0) ; SendMessage (hwndCheck, BM_SETCHECK, 0, 0) ; EnableWindow (hwndDTP, TRUE) ; EnableWindow (hwndCheck, TRUE) ; EnableWindow (hwndPush, FALSE) ; SetFocus (hwndDTP) ; return 0 ; } return 0 ; // The WM_NOTIFY message comes from the date and time picker. // If the user has checked "Set Alarm" and then gone back to // change the alarm time, there might be a discrepancy between // the displayed time and the one-shot timer. So the program // unchecks "Set Alarm" and kills any outstanding timer. case WM_NOTIFY: switch (wParam) // control ID { case ID_TIMEPICK: switch (((NMHDR *) lParam)->code) // notification code { case DTN_DATETIMECHANGE: if (SendMessage (hwndCheck, BM_GETCHECK, 0, 0)) { KillTimer (hwnd, ID_TIMER) ; SendMessage (hwndCheck, BM_SETCHECK, 0, 0) ; } return 0 ; } } return 0 ; // The WM_COMMAND message comes from the two buttons. case WM_TIMER: // When the timer message comes, kill the timer (because we only // want a one-shot) and start the annoying alarm noise going. KillTimer ( hwnd, ID_TIMER) ; PlaySound ( (PTSTR) pwaveform, NULL, SND_MEMORY | SND_LOOP | SND_ASYNC); // Let the sleepy user turn off the timer by slapping the // space bar. If the window is minimized, it's restored; then // it's brought to the forefront; then the pushbutton is enabled // and given the input focus. EnableWindow (hwndDTP, FALSE) ; EnableWindow (hwndCheck, FALSE) ; EnableWindow (hwndPush, TRUE) ; hwndFocus = hwndPush ; ShowWindow (hwnd, SW_RESTORE) ; SetForegroundWindow (hwnd) ; return 0 ; // Clean up if the alarm is ringing or the timer is still set. case WM_DESTROY: free (pwaveform) ; if (IsWindowEnabled (hwndPush)) PlaySound (NULL, NULL, 0) ; if (SendMessage (hwndCheck, BM_GETCHECK, 0, 0)) KillTimer (hwnd, ID_TIMER) ; PostQuitMessage (0) ; return 0 ; } return DefWindowProc (hwnd, message, wParam, lParam) ; } LRESULT CALLBACK SubProc ( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { int idNext, id = GetWindowLong (hwnd, GWL_ID) ; switch (message) { case WM_CHAR: if (wParam == '\t') { idNext = id ; do idNext = (idNext + (GetKeyState (VK_SHIFT) < 0 ? 2 : 1)) % 3 ; while (!IsWindowEnabled (GetDlgItem (GetParent (hwnd), idNext))); SetFocus (GetDlgItem (GetParent (hwnd), idNext)) ; return 0 ; } break ; case WM_SETFOCUS: hwndFocus = hwnd ; break ; } return CallWindowProc ( SubbedProc [id], hwnd, message, wParam,lParam) ; }

WAKEUP¨º1¨®?¦Ì?2¡§D???¨®D¨¢???¡¤?2¡§¡ê?¦Ì?¨º?¡À??¡¥???¨´?¡ê¨º¦Ì?¨º¦Ì?2¡§D??¨²WndProc¦Ì?WM_CREATE???¡é¡ä|¨¤¨ª?¨²???????¡ê?¨´¨®D¦Ì?2¡§D????t??¡ä¡é¡ä??¨²?¨²¡ä??D?¡ê???¨°?a???¨²¡ä??¨¦¦Ì?????¡ä?¦ÌY??PlaySoundo¡¥¨ºy¡ê???o¡¥¨ºy¨º1¨®?SND_MEMORY?¡éSND_LOOPo¨ªSND_ASYNC2?¨ºy?¡ê

WAKEUP¨º1¨®?3??a?¡ãDate-Time Picker?¡À¦Ì?¨ª¡§¨®????t?¡ê?a?????t¨®?¨¤¡ä¨¨?¨º1¨®??????????¡§¦Ì?¨¨??¨²o¨ª¨º¡À??¡ê¡§WAKEUP??¨º1¨®?¨º¡À??¨¬???1|?¨¹¡ê??¡ê3¨¬D¨°?¨¦¨°?¨º1¨®?SYSTEMTIME?¨¢11¨¤¡ä??¦Ì?o¨ª¨¦¨¨?¡§¨º¡À??¡ê??¨²??¦Ì?o¨ª¨¦¨¨?¡§PC¡Á?¨¦¨ª¨º¡À?¨®¨º¡À¨°2¨º1¨®????¨¢11?¡ê¨°a?¨¤¡¤???¨¢??aDate-Time Picker¡ê???¨º?¡Á??¡§¨¢¡é2?¡ä?¨®D¨¨?o?DTS?¨´¨º??¨¬¡À¨º¦Ì?¡ä¡ã?¨²?¡ê

¡Á¡é¨°aWM_CREATE???¡é?¨¢¨º?¨º¡À¦Ì?¡ä|¨¤¨ª¡¤?¨º?¡êo3¨¬D¨°?¨´?¡§?¨²?¨²?¡¥?????¡ã??DD?¨¹¡ê?2¡é?¡ê¨ª??¨¹?¨²8D?¨º¡À??o¨®¨¤¡ä??D??¨²?¡ê

???¨²o¨¹?¡Â??¡ê??¨¦¨°?¡ä¨®GetLocalTimeo¡¥¨ºy?¨²SYSTEMTIME?¨¢11??¦Ì????¡ã¨º¡À??¡ê????¨°?¨¦¨°??¡ã¨º?1¡è?¡À???¨®¨º¡À???¡ê¦Ì??¨²¨°?¡ã??¨¦????¡ê?¡ä???????¨¦??¡ã?¨¬2¨¦¡ä¨®¨®¨²24D?¨º¡À¦Ì??¨¢1?¨º¡À??¡ê??a¨°a??¡Á??¨²¡À?D????¨®¨¬¨¬¨ºy¡Á???¡ê?¨¨?o¨®?¨¦?¨¹¨¦??¡ã???¨®??¡ê¡§¨°¨°¡ä??1¡À?D?¨®D¨®?¨®¨²????¨¬¨¬¨ºyo¨ª¨¨¨°?¨º?¨¬2¨¦¦Ì????-¡ê?¡ê?¡Á?o¨®?¨²?¨¦?¨¹?1¨°a???¨®?¨º?¡ê

¨º?¨º¦Ì¨¦?¡ê?¨ª???¦Ì?¡¤?¡¤¡§¡ê¡§¨¤¡ä¡Á?/Platform SDK/Windows Base Services/General Library/Time/Time Reference/Time Structures/SYSTEMTIME¡ê?¨º???SYSTEMTIME¡Áa???aFILETIME?¨¢11¡ê¡§¨º1¨®?SystemTimeToFileTime¡ê?¡ê???FILETIME?¨¢11????¡Áa???aLARGE_INTEGER?¨¢11¡ê??¨²¡ä¨®??¨ºy¨¦???DD????¡ê??¨´????¡Áa????FILETIME?¨¢11¡ê?¨¨?o¨®¡Áa????SYSTEMTIME?¨¢11¡ê¡§¨º1¨®?FileTimeToSystemTime¡ê??¡ê

1?????¨°?¡ê?FILETIME?¨¢11¨®?¨®¨²??¦Ì?o¨ª¨¦¨¨?¡§???t¡Á?o¨®¨°?¡ä??¨¹D?¦Ì?¨º¡À???¡ê¡ä??¨¢11¨¨???¡êo

type struct _FILETIME       			// ft
{
     	DWORD dwLowDateTime ;
     	DWORD dwHighDateTime ;
}
FILETIME ;

?a¨¢???¡Á???¨°??e¡À¨ª¨º?¨¢?¡ä¨®1601?¨º1??1¨¨??e????1000¨°¨²¡¤???¨°????¨´??¨º?¦Ì?64???¦Ì?¡ê

Microsoft C/C++¡À¨¤¨°??¡Â?¡ì3?64????¨ºy¡Á¡Â?aANSI C¦Ì?¡¤?¡À¨º¡Á??¨®¨¦¨¬¨®?¡¤¡§?¡ê¨ºy?Y¨¤¨¤D¨ª¨º?__int64?¡ê?¨²?¨¦¨°???__int64D¨ª¨¬???DD?¨´¨®D¦Ì?3¡ê1???¨º?????¡ê?2¡é?¨°¨®D¨°?D???DD¨º¡À?¨²¨¢¡ä?¨®?ao¡¥¨ºy¨°2?¡ì3??¨¹???¡êWindows¦Ì?WINNT.H¡À¨ª¨ª¡¤???t?¡§¨°?¨¨???¡êo

typedef __int64 LONGLONG ;
typedef unsigned __int64 DWORDLONG ;

?¨²Windows?D¡ê??a¨®D¨º¡À3??a?¡ã??¡Á?¡Á¨¦?¡À¡ê??¨°???¨¹??¡À¨¦¦Ì?3??a?¡ã¡ä¨®??¨ºy?¡À?¡ê¨°2¨®D¨°???union?¡§¨°?¨¨???¡êo

typedef union _LARGE_INTEGER
{
     	struct
     	{
          		DWORD LowPart ;
          		LONG  HighPart ;
  	} ;
     	LONGLONG QuadPart ;
}
LARGE_INTEGER ;

?a¨º?/Platform SDK/Windows Base Services/General Library/Large Integer Operations?D¦Ì?¨¨?2????t?¡ê¡ä?union?¨ºD¨ª?¨²¨º1¨®?32???¨°??64??¦Ì?¡ä¨®??¨ºy?¡ê




Copyright1997-2001 SoftChina Corporation. All rights reserved.