Advertisement
Guest User

infrared wave

a guest
Mar 1st, 2011
737
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 16.34 KB | None | 0 0
  1.  
  2. #define USE_FP_MATH
  3.  
  4. //#include <afx.h>
  5.  
  6. #include <stdio.h>
  7. #include <string.h>
  8.  
  9. typedef long long __int64;
  10. typedef unsigned char BOOL;
  11. typedef unsigned char BYTE;
  12. typedef unsigned int UINT;
  13. typedef unsigned short WORD;
  14. typedef unsigned int DWORD;
  15. #define TRUE 1
  16. #define FALSE 0
  17. #define ASSERT(x)
  18. #define TRACE1(a,b)
  19. #define TRACE2(a,b,c)
  20.  
  21.  
  22. #include "main.h"
  23.  
  24.  
  25. #ifdef USE_FP_MATH
  26. #include "math.h"
  27. const double dPi=3.1415927;
  28. const double dPi2=dPi*2;
  29. #endif
  30.  
  31. const UINT c_uAudioBufferSize=60*1024;
  32.  
  33.  
  34. struct codeElement {
  35.   UINT onTime;   // duration of "On" time
  36.   UINT offTime;  // duration of "Off" time
  37. };
  38.  
  39. struct powercode {
  40.   UINT freq;
  41.   struct codeElement codes[100/*DOES NOT COMPILE WITHOUT NUMBER*/];  // flexible number of on/off codes
  42. };
  43.  
  44. #define freq_to_timerval(x) (x)
  45. #define PROGMEM
  46. #define PGM_P
  47.  
  48. #include "NAcodes.c"
  49.  
  50. /*
  51.     RIFF_HDR        riff_hdr;
  52.     RIFF_HDR        fmt_chunk_hdr;
  53.     WAVE_FMT_CHUNK  fmt_chunk;
  54.     WAVE_FMT_MSPCM  fmt_mspcm;
  55.     RIFF_HDR        data_chunk_hdr;
  56. */
  57.  
  58.  
  59. int main()
  60. {
  61.     CAudio a;
  62.  
  63.     //a.SetSampleRate(44100);
  64.     a.SetSampleRate(48000,TRUE,2);
  65.  
  66.     const UINT max_carrier = a.GetSampleRate()*10/11;
  67.     TRACE1("Max carrier frequency: %i Hz\n",max_carrier);
  68.  
  69.     for(UINT n=0; n<num_codes; ++n) {
  70.  
  71.         const powercode &c=*powerCodes[n];
  72.  
  73.         if(c.freq > max_carrier) {
  74.             TRACE2("Code %s skipped - freq = %i Hz\n",codeNames[n],c.freq);
  75.             continue;
  76.         }
  77.  
  78.         char s[200];
  79.         sprintf(s,"%03i_%s.wav",n,codeNames[n]);
  80.         a.Open(s);
  81.  
  82.         a.SetFrequency(c.freq/2);
  83.  
  84.         UINT u=0;
  85.         while(c.codes[u].offTime) {
  86.             a.Pulse(c.codes[u].onTime*10);
  87.             a.Pulse(c.codes[u].offTime*-10);
  88.             ++u;
  89.         }
  90.         a.Pulse(c.codes[u].onTime*10);
  91.         a.Pulse(-100*1000);
  92.  
  93.         a.Close();
  94.     }
  95.  
  96.     return 0;
  97. }
  98.  
  99.  
  100.  
  101.  
  102.  
  103.  
  104. CAudio::CAudio()
  105. {
  106.     ASSERT(sizeof(short int)==2);
  107.     ASSERT(sizeof(UINT)==4);
  108.     ASSERT(sizeof(DWORD)==4);
  109.  
  110.     m_bFile=FALSE;
  111.     //m_hWaveOut=NULL;
  112.     m_pbyAudioBuf=NULL;
  113.  
  114.     //SetSampleRate(48000,TRUE,2);      // default
  115. }
  116.  
  117. CAudio::~CAudio()
  118. {
  119.     Close();
  120. }
  121.  
  122. int CAudio::Open(char *sFile)   //LPCSTR sFile)
  123. {
  124.     m_bFile=(sFile!=NULL);
  125.  
  126.     delete[] m_pbyAudioBuf;
  127.     m_pbyAudioBuf=new BYTE[c_uAudioBufferSize];
  128.     m_uAudioBuf=m_uAudioLen=0;
  129.     m_pbyWaveData=m_pbyAudioBuf;
  130.  
  131.     if(m_bFile) {
  132.         TRACE1("File: %s\n",sFile);
  133.         m_file = fopen(sFile, "wb");
  134.         m_uAudioBufferLimit=c_uAudioBufferSize;
  135.         RiffHeader();
  136.     } else {
  137. /*      waveOutOpen(&m_hWaveOut, WAVE_MAPPER, &m_wf, 0, 0, CALLBACK_NULL | WAVE_ALLOWSYNC);
  138.  
  139.         m_uAudioBufferLimit=c_uAudioBufferSize>>1;
  140.  
  141.         m_bPending[0]=m_bPending[1]=FALSE;
  142.         m_pHdr=m_hdr;
  143.         m_pbPending=m_bPending;*/
  144.     }
  145.  
  146.     return 0;
  147. }
  148.  
  149. void CAudio::Close(void)
  150. {
  151.     FlushAudioOutput();
  152.     FlushAudioOutput(); // Both waveOut buffers
  153.  
  154.     if(m_bFile) {
  155.         RiffHeader();
  156.         fclose(m_file);
  157.     } else {
  158. //      if(m_hWaveOut) waveOutClose(m_hWaveOut);
  159.     }
  160.  
  161.     delete[] m_pbyAudioBuf;
  162.     m_pbyAudioBuf=NULL;
  163.     m_bFile=FALSE;
  164.     //m_hWaveOut=NULL;
  165. }
  166.  
  167. void CAudio::RiffHeader(void)
  168. {
  169.     memcpy(riff_hdr.id,"RIFF",4);
  170.  
  171.     memcpy(fmt_chunk_hdr.id,"fmt ",4);
  172.     fmt_chunk_hdr.len=sizeof(fmt_chunk)+sizeof(fmt_mspcm);
  173.  
  174.     memcpy(data_chunk_hdr.id,"data",4);
  175.  
  176.     fseek(m_file, 0, SEEK_SET);
  177.  
  178.     riff_hdr.len=4+sizeof(fmt_chunk_hdr)+sizeof(fmt_chunk)+
  179.             sizeof(fmt_mspcm)+sizeof(data_chunk_hdr)+m_uAudioLen;
  180.     fwrite(&riff_hdr,1,sizeof(riff_hdr), m_file);
  181.    
  182.     fwrite("WAVE",1,4,m_file);
  183.  
  184.     fwrite(&fmt_chunk_hdr,1,sizeof(fmt_chunk_hdr), m_file);
  185.  
  186.     fwrite(&fmt_chunk,1,sizeof(fmt_chunk), m_file);
  187.  
  188.     fwrite(&fmt_mspcm,1,sizeof(fmt_mspcm), m_file);
  189.  
  190.     data_chunk_hdr.len=m_uAudioLen;
  191.     fwrite(&data_chunk_hdr,1,sizeof(data_chunk_hdr), m_file);
  192.  
  193. }
  194.  
  195. void CAudio::SetSampleRate(UINT uSampleRate, BOOL b16Bit, UINT uChannels)
  196. {
  197.     m_uSampleRate=uSampleRate;
  198.     m_uSampleBytes=b16Bit?2:1;
  199.     m_uChannels=uChannels;
  200.  
  201.     TRACE1("Sample Rate: %u\n",m_uSampleRate);
  202.     TRACE1("Sample Bytes: %u\n",m_uSampleBytes);
  203.     TRACE1("Channels: %u\n",m_uChannels);
  204.  
  205.     // File
  206.     fmt_chunk.wFormatTag=1;                     // PCM linear
  207.     fmt_chunk.wChannels=m_uChannels;
  208.     fmt_chunk.dwSamplesPerSec=m_uSampleRate;    // Sample rate
  209.     fmt_chunk.dwAvgBytesPerSec=m_uSampleRate*m_uSampleBytes*m_uChannels;
  210.     fmt_chunk.wBlockAlign=m_uChannels*m_uSampleBytes;
  211.  
  212.     fmt_mspcm.wBitsPerSample=8*m_uSampleBytes;
  213.  
  214.     // Sound card
  215.     //m_wf.wFormatTag=WAVE_FORMAT_PCM;
  216.     //m_wf.nChannels=m_uChannels;
  217.     //m_wf.nSamplesPerSec=m_uSampleRate;
  218.     //m_wf.wBitsPerSample=8*m_uSampleBytes;
  219.     //m_wf.nBlockAlign=m_uChannels*m_uSampleBytes;
  220.     //m_wf.nAvgBytesPerSec=m_uSampleRate*m_uSampleBytes*m_uChannels;
  221.     //m_wf.cbSize=0;
  222. }
  223.  
  224. void CAudio::SetFrequency(UINT freq)
  225. {
  226.     m_uFrequency=freq;
  227. #ifdef USE_FP_MATH
  228.     m_dPhase=0.0;
  229.     m_dPhaseIncrement=m_uFrequency*dPi2/m_uSampleRate;
  230. #else
  231.     m_uPhase=0;
  232.     m_uPhaseTotal=256*(1<<20);
  233.     m_uPhaseHalf=m_uPhaseTotal/2;
  234.     m_uPhaseIncrement=static_cast<UINT>(static_cast<unsigned __int64>(m_uFrequency)*m_uPhaseTotal/m_uSampleRate);
  235.     TRACE("Phase Increment Whole: %i\n",m_uPhaseIncrement>>20);
  236.     TRACE("Phase Increment Fractional: %i\n",m_uPhaseIncrement&0x000FFFFF);
  237.     TRACE("Frequency: %i Hz\n",static_cast<UINT>(static_cast<unsigned __int64>(m_uSampleRate)*m_uPhaseIncrement/m_uPhaseTotal));
  238. #endif
  239. }
  240.  
  241. void CAudio::FlushAudioOutput(void)
  242. {
  243.     if(m_bFile) {
  244.         if(m_uAudioBuf==0) return;
  245.         fwrite(m_pbyWaveData,1,m_uAudioBuf, m_file);
  246.     } else {
  247. /*      if(!m_hWaveOut) return;
  248.         if(m_uAudioBuf) {
  249.             m_pHdr->lpData=(char*)m_pbyWaveData;
  250.             m_pHdr->dwBufferLength=m_uAudioBuf;
  251.             m_pHdr->dwBytesRecorded=0;
  252.             m_pHdr->dwUser=0;
  253.             m_pHdr->dwFlags=0;
  254.             m_pHdr->dwLoops=0;
  255.             m_pHdr->lpNext=0;
  256.             m_pHdr->reserved=0;
  257.  
  258.             TRACE2("Writing %u bytes to buffer %i\n",
  259.                 m_pHdr->dwBufferLength,m_pHdr==&m_hdr[0]?0:1);
  260.  
  261.             waveOutPrepareHeader(m_hWaveOut, m_pHdr, sizeof(m_hdr));
  262.             waveOutWrite(m_hWaveOut, m_pHdr, sizeof(m_hdr));
  263.  
  264.             *m_pbPending=TRUE;
  265.         } else
  266.             *m_pbPending=FALSE;
  267.  
  268.         if(m_pHdr==&m_hdr[0]) {
  269.             ASSERT(m_pbyWaveData==m_pbyAudioBuf);
  270.             m_pHdr=&m_hdr[1];
  271.             m_pbPending=&m_bPending[1];
  272.             m_pbyWaveData=m_pbyAudioBuf+m_uAudioBufferLimit;
  273.         } else {
  274.             ASSERT(m_pHdr==&m_hdr[1]);
  275.             ASSERT(m_pbyWaveData==m_pbyAudioBuf+m_uAudioBufferLimit);
  276.             m_pHdr=&m_hdr[0];
  277.             m_pbPending=&m_bPending[0];
  278.             m_pbyWaveData=m_pbyAudioBuf;
  279.         }
  280.         TRACE("Switch to buffer %i\n",m_pHdr==&m_hdr[0]?0:1);
  281.         if(*m_pbPending) {
  282.             while(((volatile)m_pHdr->dwFlags & WHDR_DONE)==0) Sleep(50);
  283.             waveOutUnprepareHeader(m_hWaveOut, m_pHdr, sizeof(m_hdr));
  284.             TRACE("Buf %i done, ready for more data\n",m_pHdr==&m_hdr[0]?0:1);
  285.             *m_pbPending=FALSE;
  286.         }*/
  287.     }
  288.     m_uAudioLen+=m_uAudioBuf;
  289.     m_uAudioBuf=0;
  290. }
  291.  
  292.  
  293. UINT CAudio::Silence(const UINT uSamples)
  294. {
  295.     for(UINT u=0; u<uSamples; ++u) {
  296.         if(m_uSampleBytes==1) {
  297.             m_pbyWaveData[m_uAudioBuf++]=0x80;
  298.             if(m_uChannels==2) {
  299.                 m_pbyWaveData[m_uAudioBuf++]=0x80;
  300.             }
  301.         } else {
  302.             *((short int*)(&m_pbyWaveData[m_uAudioBuf]))=0;
  303.             m_uAudioBuf+=2;
  304.             if(m_uChannels==2) {
  305.                 *((short int*)(&m_pbyWaveData[m_uAudioBuf]))=0;
  306.                 m_uAudioBuf+=2;
  307.             }
  308.         }
  309.         if(m_uAudioBuf>=m_uAudioBufferLimit) {
  310.             ASSERT(m_uAudioBuf==m_uAudioBufferLimit);
  311.             FlushAudioOutput();
  312.         }
  313.     }
  314.     return uSamples;
  315. }
  316.  
  317. #ifdef USE_FP_MATH
  318.  
  319. UINT CAudio::Sine(const UINT uHalfCycleCount)
  320. {
  321.     m_dPhase=0.0;
  322.     UINT uSamples=0;
  323.     UINT uHalfCycle=0;
  324.     do {
  325.         const double dEndPhase=(uHalfCycle+1==uHalfCycleCount)?dPi:dPi2;
  326.         do {
  327.             if(m_uSampleBytes==1) {
  328.                 int i=(int)(sin(m_dPhase)*120);
  329.                 m_pbyWaveData[m_uAudioBuf++]=128+i;
  330.                 if(m_uChannels==2) {
  331.                     i=(int)(sin(m_dPhase+dPi)*120);
  332.                     m_pbyWaveData[m_uAudioBuf++]=128+i;
  333.                 }
  334.             } else {
  335.                 *((short int*)(&m_pbyWaveData[m_uAudioBuf]))=(int)(sin(m_dPhase)*32000);
  336.                 m_uAudioBuf+=2;
  337.                 if(m_uChannels==2) {
  338.                     *((short int*)(&m_pbyWaveData[m_uAudioBuf]))=(int)(sin(m_dPhase+dPi)*32000);
  339.                     m_uAudioBuf+=2;
  340.                 }
  341.             }
  342.             ++uSamples;
  343.             if(m_uAudioBuf>=m_uAudioBufferLimit) {
  344.                 ASSERT(m_uAudioBuf==m_uAudioBufferLimit);
  345.                 FlushAudioOutput();
  346.             }
  347.             m_dPhase+=m_dPhaseIncrement;
  348.         } while(m_dPhase < dEndPhase);
  349.         m_dPhase-=dPi2;
  350.         uHalfCycle+=2;
  351.     } while(uHalfCycle < uHalfCycleCount);
  352.     return uSamples;
  353. }
  354.  
  355. #else
  356.  
  357. UINT CAudio::Sine(const UINT uHalfCycleCount)
  358. {
  359.     static const BYTE bySin[512]={
  360.         128,    130,    133,    136,    139,    142,    145,    148,
  361.         151,    154,    157,    160,    162,    165,    168,    171,
  362.         173,    176,    179,    181,    184,    187,    189,    192,
  363.         194,    197,    199,    201,    204,    206,    208,    210,
  364.         212,    214,    216,    218,    220,    222,    224,    226,
  365.         227,    229,    230,    232,    233,    235,    236,    237,
  366.         238,    239,    240,    241,    242,    243,    244,    245,
  367.         245,    246,    246,    247,    247,    247,    247,    247,
  368.         247,    247,    247,    247,    247,    247,    246,    246,
  369.         245,    245,    244,    243,    242,    241,    240,    239,
  370.         238,    237,    236,    235,    233,    232,    230,    229,
  371.         227,    226,    224,    222,    220,    218,    216,    214,
  372.         212,    210,    208,    206,    204,    201,    199,    197,
  373.         194,    192,    189,    187,    184,    181,    179,    176,
  374.         173,    171,    168,    165,    162,    160,    157,    154,
  375.         151,    148,    145,    142,    139,    136,    133,    130,
  376.         128,    126,    123,    120,    117,    114,    111,    108,
  377.         105,    102,    99,     96,     94,     91,     88,     85,
  378.         83,     80,     77,     75,     72,     69,     67,     64,
  379.         62,     59,     57,     55,     52,     50,     48,     46,
  380.         44,     42,     40,     38,     36,     34,     32,     30,
  381.         29,     27,     26,     24,     23,     21,     20,     19,
  382.         18,     17,     16,     15,     14,     13,     12,     11,
  383.         11,     10,     10,     9,      9,      9,      9,      9,
  384.         9,      9,      9,      9,      9,      9,      10,     10,
  385.         11,     11,     12,     13,     14,     15,     16,     17,
  386.         18,     19,     20,     21,     23,     24,     26,     27,
  387.         29,     30,     32,     34,     36,     38,     40,     42,
  388.         44,     46,     48,     50,     52,     55,     57,     59,
  389.         62,     64,     67,     69,     72,     75,     77,     80,
  390.         83,     85,     88,     91,     94,     96,     99,     102,
  391.         105,    108,    111,    114,    117,    120,    123,    126,
  392.         128,    130,    133,    136,    139,    142,    145,    148,
  393.         151,    154,    157,    160,    162,    165,    168,    171,
  394.         173,    176,    179,    181,    184,    187,    189,    192,
  395.         194,    197,    199,    201,    204,    206,    208,    210,
  396.         212,    214,    216,    218,    220,    222,    224,    226,
  397.         227,    229,    230,    232,    233,    235,    236,    237,
  398.         238,    239,    240,    241,    242,    243,    244,    245,
  399.         245,    246,    246,    247,    247,    247,    247,    247,
  400.         247,    247,    247,    247,    247,    247,    246,    246,
  401.         245,    245,    244,    243,    242,    241,    240,    239,
  402.         238,    237,    236,    235,    233,    232,    230,    229,
  403.         227,    226,    224,    222,    220,    218,    216,    214,
  404.         212,    210,    208,    206,    204,    201,    199,    197,
  405.         194,    192,    189,    187,    184,    181,    179,    176,
  406.         173,    171,    168,    165,    162,    160,    157,    154,
  407.         151,    148,    145,    142,    139,    136,    133,    130,
  408.         128,    126,    123,    120,    117,    114,    111,    108,
  409.         105,    102,    99,     96,     94,     91,     88,     85,
  410.         83,     80,     77,     75,     72,     69,     67,     64,
  411.         62,     59,     57,     55,     52,     50,     48,     46,
  412.         44,     42,     40,     38,     36,     34,     32,     30,
  413.         29,     27,     26,     24,     23,     21,     20,     19,
  414.         18,     17,     16,     15,     14,     13,     12,     11,
  415.         11,     10,     10,     9,      9,      9,      9,      9,
  416.         9,      9,      9,      9,      9,      9,      10,     10,
  417.         11,     11,     12,     13,     14,     15,     16,     17,
  418.         18,     19,     20,     21,     23,     24,     26,     27,
  419.         29,     30,     32,     34,     36,     38,     40,     42,
  420.         44,     46,     48,     50,     52,     55,     57,     59,
  421.         62,     64,     67,     69,     72,     75,     77,     80,
  422.         83,     85,     88,     91,     94,     96,     99,     102,
  423.         105,    108,    111,    114,    117,    120,    123,    126
  424.     };
  425.     static const short int iSin[512]={
  426.         0785,    1570,   2354,   3136,   3917,   4695,   5470,
  427.         6242,   7011,   7775,   8534,   9289,   100371078011516,
  428.         1224512967136811438715084157721645117119,
  429.         1777818425190621968720300209012148922065,
  430.         2262723175237102423024736252272570226162,
  431.         2660727035274472784228221285832892729254,
  432.         2956429855301293038430622308403104131222,
  433.         3138531528316533175931845319133196131990,
  434.         3199931990319613191331845317593165331528,
  435.         3138531222310403084030622303843012929855,
  436.         2956429254289272858328221278422744727035,
  437.         2660726162257022522724736242302371023175,
  438.         2262722065214892090120300196871906218425,
  439.         1777817119164511577215084143871368112967,
  440.         122451151610780100379289,   8534,   7775,   7011,
  441.         6242,   5470,   4695,   3917,   3136,   2354,   1570,   785,
  442.         0,      -785,   -1570-2354-3136-3917-4695-5470,
  443.         -6242-7011-7775-8534-9289-10037, -10780, -11516,
  444.         -12245, -12967, -13681, -14387, -15084, -15772, -16451, -17119,
  445.         -17778, -18425, -19062, -19687, -20300, -20901, -21489, -22065,
  446.         -22627, -23175, -23710, -24230, -24736, -25227, -25702, -26162,
  447.         -26607, -27035, -27447, -27842, -28221, -28583, -28927, -29254,
  448.         -29564, -29855, -30129, -30384, -30622, -30840, -31041, -31222,
  449.         -31385, -31528, -31653, -31759, -31845, -31913, -31961, -31990,
  450.         -31999, -31990, -31961, -31913, -31845, -31759, -31653, -31528,
  451.         -31385, -31222, -31040, -30840, -30622, -30384, -30129, -29855,
  452.         -29564, -29254, -28927, -28583, -28221, -27842, -27447, -27035,
  453.         -26607, -26162, -25702, -25227, -24736, -24230, -23710, -23175,
  454.         -22627, -22065, -21489, -20901, -20300, -19687, -19062, -18425,
  455.         -17778, -17119, -16451, -15772, -15084, -14387, -13681, -12967,
  456.         -12245, -11516, -10780, -10037, -9289-8534-7775-7011,
  457.         -6242-5470-4695-3917-3136-2354-1570-785,
  458.         0,      785,    1570,   2354,   3136,   3917,   4695,   5470,
  459.         6242,   7011,   7775,   8534,   9289,   100371078011516,
  460.         1224512967136811438715084157721645117119,
  461.         1777818425190621968720300209012148922065,
  462.         2262723175237102423024736252272570226162,
  463.         2660727035274472784228221285832892729254,
  464.         2956429855301293038430622308403104131222,
  465.         3138531528316533175931845319133196131990,
  466.         3199931990319613191331845317593165331528,
  467.         3138531222310403084030622303843012929855,
  468.         2956429254289272858328221278422744727035,
  469.         2660726162257022522724736242302371023175,
  470.         2262722065214892090120300196871906218425,
  471.         1777817119164511577215084143871368112967,
  472.         122451151610780100379289,   8534,   7775,   7011,
  473.         6242,   5470,   4695,   3917,   3136,   2354,   1570,   785,
  474.         0,      -785,   -1570-2354-3136-3917-4695-5470,
  475.         -6242-7011-7775-8534-9289-10037, -10780, -11516,
  476.         -12245, -12967, -13681, -14387, -15084, -15772, -16451, -17119,
  477.         -17778, -18425, -19062, -19687, -20300, -20901, -21489, -22065,
  478.         -22627, -23175, -23710, -24230, -24736, -25227, -25702, -26162,
  479.         -26607, -27035, -27447, -27842, -28221, -28583, -28927, -29254,
  480.         -29564, -29855, -30129, -30384, -30622, -30840, -31041, -31222,
  481.         -31385, -31528, -31653, -31759, -31845, -31913, -31961, -31990,
  482.         -31999, -31990, -31961, -31913, -31845, -31759, -31653, -31528,
  483.         -31385, -31222, -31040, -30840, -30622, -30384, -30129, -29855,
  484.         -29564, -29254, -28927, -28583, -28221, -27842, -27447, -27035,
  485.         -26607, -26162, -25702, -25227, -24736, -24230, -23710, -23175,
  486.         -22627, -22065, -21489, -20901, -20300, -19687, -19062, -18425,
  487.         -17778, -17119, -16451, -15772, -15084, -14387, -13681, -12967,
  488.         -12245, -11516, -10780, -10037, -9289-8534-7775-7011,
  489.         -6242-5470-4695-3917-3136-2354-1570-785
  490.     };
  491.  
  492.     m_uPhase=0;
  493.     UINT uSamples=0;
  494.     UINT uHalfCycle=0;
  495.     do {
  496.         const UINT uEndPhase=(uHalfCycle+1==uHalfCycleCount)?m_uPhaseHalf:m_uPhaseTotal;
  497.         do {
  498.             if(m_uSampleBytes==1) {
  499.                 BYTE by=bySin[m_uPhase>>20];
  500.                 m_pbyWaveData[m_uAudioBuf++]=by;
  501.                 if(m_uChannels==2) {
  502.                     by=bySin[(m_uPhase+m_uPhaseHalf)>>20];
  503.                     m_pbyWaveData[m_uAudioBuf++]=by;
  504.                 }
  505.             } else {
  506.                 short int i=iSin[m_uPhase>>20];
  507.                 *((short int*)(&m_pbyWaveData[m_uAudioBuf]))=i;
  508.                 m_uAudioBuf+=2;
  509.                 if(m_uChannels==2) {
  510.                     i=iSin[(m_uPhase+m_uPhaseHalf)>>20];
  511.                     *((short int*)(&m_pbyWaveData[m_uAudioBuf]))=i;
  512.                     m_uAudioBuf+=2;
  513.                 }
  514.             }
  515.             ++uSamples;
  516.             if(m_uAudioBuf>=m_uAudioBufferLimit) {
  517.                 ASSERT(m_uAudioBuf==m_uAudioBufferLimit);
  518.                 FlushAudioOutput();
  519.             }
  520.             m_uPhase+=m_uPhaseIncrement;
  521.         } while(m_uPhase < uEndPhase);
  522.         m_uPhase-=uEndPhase;
  523.         uHalfCycle+=2;
  524.     } while(uHalfCycle < uHalfCycleCount);
  525.     return uSamples;
  526. }
  527.  
  528. #endif  // USE_FP_MATH
  529.  
  530.  
  531. void CAudio::Pulse(int iTime)
  532. {
  533.     if(iTime>0) {
  534.         Sine(static_cast<UINT>(static_cast<__int64>(iTime)*m_uFrequency/(1000000/2)));
  535.     } else if(iTime<0) {
  536.         Silence(static_cast<UINT>(static_cast<__int64>(-iTime*m_uSampleRate/1000000)));
  537.     }
  538. }
  539.  
  540.  
  541. #if 0
  542. #include <math.h>
  543.  
  544. void MakeSineTable(void)
  545. {
  546.     const UINT table_size=256;
  547.  
  548.     const double dPi=3.1415927;
  549.     const double dPi2=dPi*2;
  550.  
  551.     UINT u=0;
  552.     while(u < table_size) {
  553.         // -- 8 bit unsigned
  554.         //const int x=0x80+(int)(sin(dPi2*(double)u/table_size)*120);
  555.         // -- 16 bit unsigned
  556.         //const int x=0x8000+(int)(sin(dPi2*(double)u/table_size)*32000);
  557.         // -- 16 bit signed
  558.         const int x=(int)(sin(dPi2*(double)u/table_size)*32000);
  559.         //printf("%s%i,",(u%8)?"\t":"\n\t\t",x);
  560.         TRACE2("%s%i,",(u%8)?"\t":"\n\t\t",x);
  561.         ++u;
  562.     }
  563. }
  564. #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement