⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sysaudiotone.c

📁 优龙YLP270开发板 光盘自带的BIOS和实验例程源码 强烈推荐
💻 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 + -