指定声卡输出固定频率的声音

Gabriel2005 2006-07-07 05:47:02
电脑装有两个声卡,通过waveOutOpen指定其中一个声卡后,如何让其输出固定频率(如1000Hz)的声音,

老大追的急,没时间去找了,哪位能帮忙给出源代码,或者是相关链接,谢谢先!
...全文
332 4 打赏 收藏 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
Gabriel2005 2006-07-12
  • 打赏
  • 举报
回复
#include <math.h>
#include <time.h>
#include <mmsystem.h>
#include "Generator.h"

#define DllExport extern "C" __declspec( dllexport )

BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
return TRUE;
}


UINT CloseDevice(void)
{
delete [] buf;
mmres=waveOutReset(ghwo);
if(mmres != MMSYSERR_NOERROR)
return 1; //"Cant close device.";
mmres=waveOutClose(ghwo);
if(mmres != MMSYSERR_NOERROR)
return 1; //"Cant close device.";
return 0;
}


UINT PrepareDevice(UINT uDeviceID)
{
pwfx=new WAVEFORMATEX;
pwfx->wFormatTag=WAVE_FORMAT_PCM;
pwfx->nChannels=1;
pwfx->nSamplesPerSec=SPS;
pwfx->nAvgBytesPerSec=SPS;
pwfx->nBlockAlign=1;
pwfx->wBitsPerSample=8;
mmres=waveOutOpen(&ghwo,uDeviceID,pwfx,dwCallback,dwCallbackInstance,fdwOpen);
delete pwfx;
if(mmres != MMSYSERR_NOERROR)
{
return 1; //"Cant open device.";
}
buf=new char[SPS];
if(buf == NULL)
{
CloseDevice();
return 2; //"Cant allocate memory.";
}
pwh.lpData=buf;
pwh.dwBufferLength=SPS;
pwh.dwFlags=WHDR_BEGINLOOP;
pwh.dwLoops=1;
mmres = waveOutPrepareHeader(ghwo,&pwh,sizeof(pwh));
pwh.dwFlags=WHDR_BEGINLOOP|WHDR_ENDLOOP|WHDR_PREPARED;
pwh.dwLoops=0xFFFFFFFF; // Number of loops == about 136 years:)
if(mmres != MMSYSERR_NOERROR)
{
CloseDevice();
return 3; //"Device prepare error.";
}
return NULL;
}


//---------------------------------------------------------------------------

void FillBuf(int freq,char amp,float phase)
{
float x=(float)(freq*2*3.1416/SPS);
for(int cnt=0;cnt<SPS;cnt++)
buf[cnt]=(char)(cos(phase+cnt*x)*amp+127);
}
//---------------------------------------------------------------------------

UINT GenFreq(void)
{
waveOutReset(ghwo);
if(mmres != MMSYSERR_NOERROR)
return 1; //"Cant reset device.";
mmres=waveOutWrite(ghwo,&pwh,sizeof(WAVEHDR));
if(mmres != MMSYSERR_NOERROR)
return 2; //"Cant write data to device.";
return 0;
}
//---------------------------------------------------------------------------

UINT StopGen(void)
{
mmres=waveOutReset(ghwo);
if(mmres != MMSYSERR_NOERROR)
return 1; //"Cant stop device.";
return 0;
}

DllExport UINT __stdcall StartAudio(int AudioDuration,UINT DevID,int freq,char amp,float phase)
{
PrepareDevice(DevID);
FillBuf(freq,amp,phase);
time(&lngStartTime);
time(&lngCurrentTime);

while(lngCurrentTime-lngStartTime<AudioDuration)
{
GenFreq();
time(&lngCurrentTime);
}

StopGen();
CloseDevice();

return 0;
}
mynamelj 2006-07-10
  • 打赏
  • 举报
回复
那就结帖!
Gabriel2005 2006-07-10
  • 打赏
  • 举报
回复
问题已解决
Gabriel2005 2006-07-07
  • 打赏
  • 举报
回复
刚找到一个,还不知道能不能用
http://www.codeproject.com/cpp/Frequency_Generator.asp

16,550

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧