📄 sysaudiotone.c
字号:
/*----------------------------------------------------------------------
* Copyright (C) 1999 Intel Corp.
* SysAudioTone.c
*/
#include "systypes.h"
#include "SysAudioToneApi.h"
#define SINESIZE 256
#define INTERP 256
static const INT16 sineTable[SINESIZE/4+1] = {
0x0000, 0x0324, 0x0647, 0x096a, 0x0c8b, 0x0fab, 0x12c8, 0x15e2,
0x18f8, 0x1c0b, 0x1f19, 0x2223, 0x2528, 0x2826, 0x2b1f, 0x2e11,
0x30fb, 0x33de, 0x36ba, 0x398c, 0x3c56, 0x3f17, 0x41ce, 0x447a,
0x471c, 0x49b4, 0x4c3f, 0x4ebf, 0x5133, 0x539b, 0x55f5, 0x5842,
0x5a82, 0x5cb4, 0x5ed7, 0x60ec, 0x62f2, 0x64e8, 0x66cf, 0x68a6,
0x6a6d, 0x6c24, 0x6dca, 0x6f5f, 0x70e2, 0x7255, 0x73b5, 0x7504,
0x7641, 0x776c, 0x7884, 0x798a, 0x7a7d, 0x7b5d, 0x7c29, 0x7ce3,
0x7d8a, 0x7e1d, 0x7e9d, 0x7f09, 0x7f62, 0x7fa7, 0x7fd8, 0x7ff6,
0x7fff};
static INT16 GetSine(UINT8 step)
{
if (step<SINESIZE/4+1) return sineTable[step];
if (step<SINESIZE/2+1) return sineTable[SINESIZE/2-step];
if (step<SINESIZE*3/4+1) return -sineTable[step-SINESIZE/2];
return -sineTable[SINESIZE-step];
}
static INT16 GetSineInterp(UINT16 step)
{
UINT16 i, x, y;
i = step % INTERP;
y = step / INTERP;
x = GetSine(y);
if (i) {
y = GetSine(y + 1);
x += (UINT16)((INT32)i * (INT16)(y - x) / INTERP);
}
return x;
}
// bufSize is number of stereo samples, two 16 bit values per sample, normally sizeof(buf)/4
void SysAudioToneFillBuf(UINT16 freq, UINT16 sampleRate, PUINT16 buf, UINT32 bufSiz)
{
UINT16 tmpVal;
UINT64 x;
for (x=0; x<bufSiz; x++) {
tmpVal = GetSineInterp((x*freq*SINESIZE*INTERP+sampleRate/2)/sampleRate);
*buf++ = tmpVal;
*buf++ = tmpVal;
}
} // SysAudioToneFillBuf
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -