QQ登录

只需一步,快速开始

上位机MFC生成正弦波通过声卡输出源代码

[ 复制链接 ]

上位机MFC生成正弦波通过声卡输出源代码

上位机MFC生成正弦波通过声卡输出源代码

如上图,例程运行后,可以点击开始或停止。
会在电脑喇叭上听到例程输出声音。
例程可以作为正弦波发生器使用。
例程创建了一个集成类CSoundOut。
可以在外部实例化一个对象CSinGenerator m_SoundOut;
调用
m_SoundOut.OpenOutput();
m_SoundOut.CloseOutput();
就可以声音的输出与停止。
关键代码段

  1. MMRESULT CSoundOut::OpenOutput()
  2. {
  3.      MMRESULT result;

  4.     result=waveOutGetNumDevs();
  5.         if (result == 0)
  6.         {
  7.         AfxMessageBox("No Sound Output Device");
  8.                 return result;
  9.         }

  10.    // test for Mic available   
  11.    result=waveOutGetDevCaps (0, &m_WaveOutDevCaps, sizeof(WAVEOUTCAPS));
  12.    
  13.    if ( result!= MMSYSERR_NOERROR)
  14.    {
  15.        AfxMessageBox(_T("Sound output Cannot determine card capabilities !"));
  16.    }

  17.         m_Terminate = FALSE;
  18. #ifndef CALL_BACK_TEST
  19.         // The SoundOut Devive is OK now we can create an Event  and start the Thread
  20.         m_WaveOutEvent = CreateEvent(NULL,FALSE,FALSE,"WaveOutThreadEvent");
  21.         m_WaveOutThread= AfxBeginThread(WaveOutThreadProc,this,THREAD_PRIORITY_TIME_CRITICAL,0,CREATE_SUSPENDED,NULL);   
  22.         m_WaveOutThread->m_bAutoDelete = TRUE;
  23. #endif
  24. // start the thread at the end of the buffer init
  25.         // init format
  26.         WaveInitFormat(1/* mono*/,m_WaveOutSampleRate /* khz */,16 /* bits */);

  27.         // Open Output
  28. #ifdef CALL_BACK_TEST
  29.         result = waveOutOpen( &m_WaveOut,0, &m_WaveFormat,(DWORD)WaveOutProc ,(ULONG)this ,CALLBACK_FUNCTION);
  30. #else
  31.         result = waveOutOpen( &m_WaveOut,0, &m_WaveFormat,(DWORD)m_WaveOutEvent ,NULL ,CALLBACK_EVENT);
  32. #endif

  33.         if ( result!= MMSYSERR_NOERROR)
  34.         {
  35.         AfxMessageBox(_T("Sound output Cannot Open Device!"));
  36.             return result;
  37.         }


  38.         m_Toggle = 0;
  39.         m_SizeRecord = m_NbMaxSamples;
  40.     m_WaveHeader[m_Toggle].lpData = (CHAR *)&OutputBuffer[m_Toggle][0];
  41.     m_WaveHeader[m_Toggle].dwBufferLength = m_SizeRecord*2;
  42.         m_WaveHeader[m_Toggle].dwFlags = 0;

  43.     result = waveOutPrepareHeader( m_WaveOut, &m_WaveHeader[m_Toggle], sizeof(WAVEHDR) );
  44.   //MMRESULT waveOutPrepareHeader( HWAVEOUT hwi, LPWAVEHDR pwh, UINT cbwh );
  45.    if ( (result!= MMSYSERR_NOERROR) || ( m_WaveHeader[m_Toggle].dwFlags != WHDR_PREPARED) )
  46.    {
  47.         AfxMessageBox(_T(" Sound Output Cannot Prepare Header !"));
  48.             return result;
  49.    }

  50.    result = waveOutWrite( m_WaveOut, &m_WaveHeader[m_Toggle], sizeof(WAVEHDR) );
  51.    if  (result!= MMSYSERR_NOERROR)
  52.    {
  53.         AfxMessageBox(_T(" Sound Output Cannot Write Buffer !"));
  54.             return result;
  55.    }


  56.    // register the second frame don't wait for the end of the first one
  57.    // so when we will be notified, this second frame will be currently output when we will reload the first one
  58.         m_Toggle = 1;
  59.         m_SizeRecord = m_NbMaxSamples;
  60.     m_WaveHeader[m_Toggle].lpData = (CHAR *)&OutputBuffer[m_Toggle][0];
  61.     m_WaveHeader[m_Toggle].dwBufferLength = m_SizeRecord*2;
  62.         m_WaveHeader[m_Toggle].dwFlags = 0;

  63.     result = waveOutPrepareHeader( m_WaveOut, &m_WaveHeader[m_Toggle], sizeof(WAVEHDR) );
  64.   //MMRESULT waveOutPrepareHeader( HWAVEOUT hwi, LPWAVEHDR pwh, UINT cbwh );
  65.    if ( (result!= MMSYSERR_NOERROR) || ( m_WaveHeader[m_Toggle].dwFlags != WHDR_PREPARED) )
  66.    {
  67.         AfxMessageBox(_T(" Sound Output Cannot Prepare Header !"));
  68.             return result;
  69.    }

  70.    result = waveOutWrite( m_WaveOut, &m_WaveHeader[m_Toggle], sizeof(WAVEHDR) );
  71.    if  (result!= MMSYSERR_NOERROR)
  72.    {
  73.         AfxMessageBox(_T(" Sound Output Cannot Write Buffer !"));
  74.             return result;
  75.    }

  76. #ifndef CALL_BACK_TEST
  77.         m_WaveOutThread->ResumeThread();
  78. #endif

  79.    return result;
  80. }
复制代码
  1. void CSoundOut::CloseOutput()
  2. {
  3.         if (m_WaveOut)
  4.                 waveOutPause(m_WaveOut);
  5.     Sleep(50);  // wait for the pause
  6.         //        CloseHandle(m_WaveOut);
  7.         m_Terminate = TRUE;
  8.     if (m_WaveOutEvent )
  9.                 SetEvent(m_WaveOutEvent);
  10.     Sleep(50);  // wait for the thread to terminate

  11.    if (m_WaveOut)
  12.    {
  13.                 waveOutReset(m_WaveOut);
  14.                 waveOutClose(m_WaveOut);
  15.    }
  16. }
复制代码
请点击此处下载

请先注册会员后在进行下载

已注册会员,请先登录后下载

文件名称:上位机MFC生成正弦波通过声卡输出源代码.rar 
文件大小:28.48 KB  售价:1金币
下载权限: 不限 以上或 VIP会员   [购买捐助会员]   [充值积分]   有问题联系我


  

上位机VC MFC程序开发精典实例大全源码与视频讲解配套下载408例

  

经历1年的编程与录制点击进入查看


  

halcon从自学到接项目视频教程,另外再赠送全网最全资源  

  

欢迎围观我录制的一套halcon自学视频教程(进入)


  

如果您认可,可联系功能定制!

  

如果您着急,充值会员可直接联系发您资料!

  

QQ联系我

微信扫扫联系我

  


回复

使用道具 举报

快速回复 返回列表 客服中心 搜索