最近在网上查了好多关于C播放wav这方面的资料,调试半天也没有结果,搜到一个编译好的EXE文件能播放,没有源代码,反汇编不了,谁能指点一下。。。。。以下两种代码段:
#include <stdio.h>
#include <dos.h>
/* wav文件结构 */
typedef struct WaveData
{
unsigned long sample_lenth;
unsigned short rate;
unsigned short channels;
unsigned char time_constant;
char bit_res;
char *name_wav;
char *sample;
} WAV;
/* wav头信息结构 */
typedef struct HeaderType
{
long riff; /*RIFF类资源文件头部*/
unsigned long file_len; /*文件长度*/
char wave[4]; /*"WAVE"标志*/
char fmt [4]; /*"fmt"标志*/
char NI1 [4]; /*过渡字节*/
unsigned short format_type;/*格式类别(10H为PCM形式的声音数据)*/
unsigned short Channels; /*Channels 1 = 单声道; 2 = 立体声*/
long frequency; /*采样频率*/
long trans_speed;/*音频数据传送速率*/
char NI2 [2]; /*过渡字节*/
short sample_bits;/*样本的数据位数(8/16)*/
char data[4]; /*数据标记符"data"*/
unsigned long wav_len; /*语音数据的长度*/
char NI3 [4]; /*过渡字节*/
} HEAD_WAV;
int G_base; /* 记录DSP芯片的基址 */
int G_port; /* 端口的基址 */
int install_DSP(); /* 初始化声卡 */
int RestDSP(int Test); /* 复位DSP芯片 */
int WriteDSP(int value); /* 向DSP芯片写数据 */
WAV *Load_wav(char *name_wav); /* 加载WAV相关信息 */
void Play_wav(WAV *Wav_file); /* 播放加载好的 WAV 文件 */
void Destroy_wav(WAV *Wav_file); /* 释放声音文件 */
int install_DSP()
{
int i, g_address[6] = {0x210, 0x220, 0x230, 0x240, 0x250, 0x260};
for (i = 0; i < 6; i++)
{
if (RestDSP(g_address[i]))
{
G_port = g_address[i]; /* 记录端口基地址 */
return 1;
}
}
return 0;
}
/****************************************************************************
检查一个声卡基址是否存在,如果存在则将声卡复位 *
****************************************************************************/
int RestDSP(int Test)
{
/* 重置DSP */
outportb(Test + 0x6, 1);
delay(50); /* 延时是必须的 */
outportb(Test + 0x6, 0);
delay(50);
/* 如果重置成功则检查 */
if ((inportb(Test + 0xE) & 0x80 == 0x80)
&& (inportb(Test + 0xA) == 0xAA))
{
G_base = Test;
return 1;
}
else
{
return 0;
}
}
WAV *Load_wav(char *name_wav)
{
FILE *fp;
HEAD_WAV Wav_file_head;
WAV *Wav_file;
/* 打开声音文件 */
if ((fp = fopen(name_wav, "rb")) == NULL)
{
printf("can't open wav file!");
return NULL;
}
/* 开辟空间 */
if ((Wav_file = (WAV *)malloc(sizeof(WAV))) == NULL)
{
printf("have't mem!");
fclose(fp);
return NULL;
}
/* 读取文件头信息 */
fread(&Wav_file_head, sizeof(HEAD_WAV), 1, fp);
/* 检查RIFF头 0x46464952 其实就是字符串 "RIFF"
这样好处理一些,毕竟比较数字比比较字符串要省事的多 */
if (Wav_file_head.riff != 0x46464952)
{
printf("isn't wav file!");
fclose(fp);
return NULL;
}
/* 获取文件名 */
Wav_file->name_wav = name_wav;
Wav_file->rate = Wav_file_head.frequency; /* 采样频率 */
Wav_file->channels = Wav_file_head.Channels; /* 声道 */
/* 计算真实采样率 */
Wav_file->time_constant = 256 - (1000000L / (Wav_file->rate * Wav_file->channels));
/* 获取声音数据长度 */
Wav_file->sample_lenth = Wav_file_head.file_len - 50;
/* 分配内存,以存放声音数据 */
if ((Wav_file->sample = (char *)malloc(Wav_file->sample_lenth)) == NULL)
{
printf("have't mem!");
fclose(fp);
return NULL;
}
/* 若文件过长 */
if (Wav_file_head.file_len - 50 > 0xC7FF)
{
/* 读取声音数据 */
fread(Wav_file->sample, 0xC7FF, 1, fp);
}
else
{
/* 读取声音数据 */
fread(Wav_file->sample, Wav_file->sample_lenth, 1, fp);
}
fclose(fp);
return Wav_file;
}
void Play_wav(WAV *Wav_file)
{
FILE *fp;
long LinearAddress;
unsigned short page, offset;
int i;
unsigned int count; /* 记录共分为几块播放 */
unsigned int romd; /* 记录不满一块的数据段长度,以便最后依次播放 */
/* 获取块数,和余数 */
count = (int)(Wav_file->sample_lenth / 51199);
romd = (int)(Wav_file->sample_lenth % 51199);
if (romd != 0)
{
count++;
}
/* 将音频流指针转换成线性地址 */
LinearAddress = FP_SEG(Wav_file->sample);
LinearAddress = (LinearAddress << 4) + FP_OFF(Wav_file->sample);
page = LinearAddress >> 16; /*计算页*/
offset = LinearAddress & 0xFFFF; /*计算页偏移*/
/*注意 :这个操作只能工作于DMA的第一通道*/
outportb (0x0A, 5); /*Mask 锁DMA通道一*/
outportb (0x0C, 0); /*清除DMA内部翻转标志*/
outportb (0x0B, 0x49); /*设置成回(播)放模式*/
/*
模式由下面几项组成:
0x49 = 二进制 01 00 10 01
| | | |
| | | +- DMA通道 01
| | +---- 读操作 (从内存到DSP)
| +------- 单一周期方式
+---------- 块方式
*/
outportb ( 0x83, page); /*将页面写入DMA控制器*/
outportb ( 0x03, 0xC7FF & 0x100);
outportb ( 0x03, 0xC7FF >> 8);
/* 开启声卡 */
WriteDSP(0xD1);
if (count == 1) /* 文件长度 <= 51199bit */
{
WriteDSP(0x40); /* DSP第40h号命令 :设置采样频率 */
WriteDSP(Wav_file->time_constant ); /* Write time constant */
outportb ( 0x02, offset & 0x100); /*将偏移量写入DMA控制器*/
outportb ( 0x02, offset >> 8);
outportb ( 0x0A, 1 ); /*激活DMA通道一*/
WriteDSP( 0x14 ); /*DSP第14h号命令 :单一周期回放*/
WriteDSP( Wav_file->sample_lenth & 0xFF );
WriteDSP( Wav_file->sample_lenth >> 8);
}
else /* 文件长度 > 51199bit */
{
fp = fopen(Wav_file->name_wav, "rb");
fseek(fp, (long)(sizeof(HEAD_WAV) + 0xC7FF), SEEK_SET);
for (i = 0; i < count; i++)
{
WriteDSP(0x40); /* DSP第40h号命令 :设置采样频率 */
WriteDSP(Wav_file->time_constant ); /* Write time constant */
outportb ( 0x02, offset & 0x100); /*将偏移量写入DMA控制器*/
outportb ( 0x02, offset >> 8);
outportb ( 0x0A, 1 ); /*激活DMA通道一*/
WriteDSP( 0x14 ); /*DSP第14h号命令 :单一周期回放*/
if (i != (count - 1))
{
WriteDSP( 0xC7FF & 0xFF );
WriteDSP( 0xC7FF >> 8);
/*重置DSP*/
RestDSP(G_port);
fread(Wav_file->sample, 0xC7FF, 1, fp);
}
else
{
WriteDSP( romd & 0xFF );
WriteDSP( romd >> 8);
/*重置DSP*/
RestDSP(G_port);
fread(Wav_file->sample, romd, 1, fp);
}
}
fclose(fp);
}
/*关闭声卡*/
WriteDSP(0xD3);
/*重置DSP*/
RestDSP(G_port);
}
int WriteDSP(int value)
{
/*等待DSP接收一个字节*/
while ((inportb(G_base + 0xC) & 0x80) == 0x80);
/*发送字节*/
outportb (G_base + 0xC, value);
}
void Destroy_wav(WAV *Wav_file)
{
if (Wav_file)
{
free(Wav_file->sample);
Wav_file->sample = NULL;
free(Wav_file);
Wav_file = NULL;
}
}
void main(void)
{
WAV *Wav_file; /* 申请音乐文件 */
if (!install_DSP()) /* 初始化DSP */
{
printf("can't install DSP!");
getch();
return(0);
}
/* 加载声音文件 */
if ((Wav_file = Load_wav("win.wav")) == NULL)
{
printf("can't load wav!");
getch();
return(0);
}
Play_wav(Wav_file); /* 播放文件 */
getch();
Destroy_wav(Wav_file); /* 销毁文件 */
}
另一个程序:
/**********************************
dma.h
***************************************/
#ifndef _DMA_H_
#define _DMA_H_
/* 包含头文件 */
#include "stdefine.h"
/* 函数声明 */
BOOL initdma8(int channel, BYTE far *addr, int size);
void closedma8(int channel);
BOOL initdma16(int channel, BYTE far *addr, int size);
void closedma16(int channel);
#endif
/************************************
dma.c
*********************************/
/* 包含头文件 */
#include <stdlib.h>
#include <dos.h>
#include "stdefine.h"
#include "dma.h"
/* 预编译开关 */
/* #define _TEST_ */
#ifndef _TEST_
/* 内部常量定义 */
/* 以下是 PC 机的 DMA 控制器端口的常量定义 */
#define DMA8_CMD_PORT 0x08 /* 8位DMA写命令寄存器端口 */
#define DMA8_STATU_PORT 0x08 /* 8位DMA独状态寄存器端口 */
#define DMA8_REQUEST_PORT 0x09 /* 8位DMA写请求寄存器端口 */
#define DMA8_MASK_PORT 0x0A /* 8位DMA屏蔽寄存器端口(只写)*/
#define DMA8_MODE_PORT 0x0B /* 8位DMA写模式寄存器端口 */
#define DMA8_CLRPTR_PORT 0x0C /* 8位DMA清先后状态寄存器端口 */
#define DMA8_RESET_PORT 0x0D /* 8位DMA写复位命令端口 */
#define DMA16_CMD_PORT 0xD0 /* 16位DMA写命令寄存器端口 */
#define DMA16_STATU_PORT 0xD0 /* 16位DMA独状态寄存器端口 */
#define DMA16_REQUEST_PORT 0xD2 /* 16位DMA写请求寄存器端口 */
#define DMA16_MASK_PORT 0xD4 /* 16位DMA屏蔽寄存器端口(只写)*/
#define DMA16_MODE_PORT 0xD6 /* 16位DMA写模式寄存器端口 */
#define DMA16_CLRPTR_PORT 0xD8 /* 16位DMA清先后状态寄存器端口 */
#define DMA16_RESET_PORT 0xDA /* 16位DMA写复位命令端口 */
/* 以下是 PC 机 DMA 的 7 个通道的地址寄存器、计数寄存器和页面寄存器的端口常量定义 */
/* 其中通道 0-3 用于 8 位的 DMA,通道 4-7 用于 16 位 DMA */
/* PC机中,规定通道 2 用于进行软盘的 DMA 传输,其余通道可供用户使用 */
#define DMA0_ADDR_PORT 0x00 /* 通道0的地址寄存器 */
#define DMA0_COUNT_PORT 0x01 /* 通道0的计数寄存器 */
#define DMA0_PAGE_PORT 0x87 /* 通道0的页面寄存器 */
#define DMA1_ADDR_PORT 0x02 /* 通道1的地址寄存器 */
#define DMA1_COUNT_PORT 0x03 /* 通道1的计数寄存器 */
#define DMA1_PAGE_PORT 0x83 /* 通道1的页面寄存器 */
#define DMA3_ADDR_PORT 0x06 /* 通道3的地址寄存器 */
#define DMA3_COUNT_PORT 0x07 /* 通道3的计数寄存器 */
#define DMA3_PAGE_PORT 0x82 /* 通道3的页面寄存器 */
#define DMA5_ADDR_PORT 0xC4 /* 通道5的地址寄存器 */
#define DMA5_COUNT_PORT 0xC6 /* 通道5的计数寄存器 */
#define DMA5_PAGE_PORT 0x8B /* 通道5的页面寄存器 */
#define DMA6_ADDR_PORT 0xC8 /* 通道6的地址寄存器 */
#define DMA6_COUNT_PORT 0xCA /* 通道6的计数寄存器 */
#define DMA6_PAGE_PORT 0x89 /* 通道6的页面寄存器 */
#define DMA7_ADDR_PORT 0xCC /* 通道7的地址寄存器 */
#define DMA7_COUNT_PORT 0xCE /* 通道7的计数寄存器 */
#define DMA7_PAGE_PORT 0x8A /* 通道7的页面寄存器 */
/* 函数实现 */
BOOL initdma8(int channel, BYTE far *addr, int size)
{
DWORD phyaddr = FP_SEG(addr) * 0x10L + FP_OFF(addr);
BYTE page = (BYTE)(phyaddr >> 16);
WORD offset = (WORD)(phyaddr >> 0);
if (channel > 3 || channel == 2) return FALSE;
outportb(DMA8_MASK_PORT, channel | (1 << 2)); /* 屏蔽该通道 */
outportb(DMA8_MODE_PORT, channel | (1 << 4) | (2 << 2)); /* 请求方式+自动初始化+读传送 */
outportb(DMA8_CLRPTR_PORT, 0);
switch (channel)
{
case 0:
outportb(DMA0_COUNT_PORT, LOWBYTE(size - 1));
/********************************
dsp.h
************************************
#ifndef _DSP_H_
#define _DSP_H_
/* 包含头文件 */
#include "stdefine.h"
/* 类型定义 */
typedef struct
{
char dspenvstr[128];
WORD dspversion;
WORD dspbaseioport;
WORD resetport;
WORD writedataport;
WORD writestatusport;
WORD readdataport;
WORD readstatusport;
WORD mixerbaseioport;
WORD mpu401baseioport;
BYTE dspirqnum;
BYTE dspdma8;
BYTE dspdma16;
} DSP, *PDSP;
/* 函数声明 */
BOOL initdsp(PDSP pdsp);
void closedsp(PDSP pdsp);
BYTE readdsp(PDSP pdsp);
void writedsp(PDSP pdsp, BYTE byte);
void printdspinfo(PDSP pdsp);
void resetdsp(PDSP pdsp);
void getdspversion(PDSP pdsp);
void setdspblocksize(PDSP pdsp, WORD blksize);
void dspintdone(PDSP pdsp);
void dspstartdma8(PDSP pdsp);
void dsppausedma8(PDSP pdsp);
void dspsetsamplerate(PDSP pdsp, WORD rate);
#endif
/***********************************
dsp.c
*********************************/
/* 包含头文件 */
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <dos.h>
#include "stdefine.h"
#include "dsp.h"
/* 预编译开关 */
/* #define _TEST_ */
#ifndef _TEST_
/* 内部常量定义 */
#define DSP_RESET_DELAY 10
#define DSP_READY 0xAA
/* DSP 命令常量定义 */
#define DSP_GET_VERSION 0xE1
#define DSP_SET_BLK_SIZE 0x48
#define DSP_START_DMA8 0x1C
#define DSP_PAUSE_DMA8 0xD0
#define DSP_SET_SAM_RATE 0x40
/* 内部函数声明 */
static int parse_sb_envstr(char *envstr, char id);
/* 内部函数实现 */
static int parse_sb_envstr(char *envstr, char id)
{
char buf[32] = "0x";
int i;
int j;
for (i = 0; envstr[i] != id && envstr[i] != '/0' && i < 128; i++);
if (envstr[i] == '/0' || i == 128) return 0;
else i++;
for (j = 2; j < 32 && envstr[i] != ' '; j++) buf[j] = envstr[i++];
return (int)strtoul(buf, NULL, 0);
}
/* 函数实现 */
BOOL initdsp(PDSP pdsp)
{
if (!getenv("BLASTER")) return FALSE;
strupr(strcpy(pdsp->dspenvstr, getenv("BLASTER")));
pdsp->dspbaseioport = parse_sb_envstr(pdsp->dspenvstr, 'A');
pdsp->resetport = pdsp->dspbaseioport + 0x06;
pdsp->writedataport = pdsp->dspbaseioport + 0x0C;
pdsp->writestatusport = pdsp->dspbaseioport + 0x0C;
pdsp->readdataport = pdsp->dspbaseioport + 0x0A;
pdsp->readstatusport = pdsp->dspbaseioport + 0x0E;
pdsp->dspirqnum = parse_sb_envstr(pdsp->dspenvstr, 'I');
pdsp->dspdma8 = parse_sb_envstr(pdsp->dspenvstr, 'D');
pdsp->dspdma16 = parse_sb_envstr(pdsp->dspenvstr, 'H');
pdsp->mixerbaseioport = parse_sb_envstr(pdsp->dspenvstr, 'M');
pdsp->mpu401baseioport = parse_sb_envstr(pdsp->dspenvstr, 'P');
resetdsp(pdsp);
getdspversion(pdsp);
return TRUE;
}
void closedsp(PDSP pdsp)
/********************************
pic.h
***************************/
#ifndef _PIC_H_
#define _PIC_H_
/* 包含头文件 */
#include "stdefine.h"
/* 函数声明 */
BOOL initpic(int irqnum);
void closepic(int irqnum);
void picintdone(void);
#endif
/********************************
pic.c
*********************************/
/* 包含头文件 */
#include <stdlib.h>
#include <dos.h>
#include "stdefine.h"
#include "pic.h"
/* 预编译开关 */
/* #define _TEST_ */
#ifndef _TEST_
/* 内部常量定义 */
#define PIC_PORT_21H 0x21
#define PIC_PORT_20H 0x20
#define PIC_EOI 0x20
/* 函数实现 */
BOOL initpic(int irqnum)
{
BYTE mask;
mask = inportb(PIC_PORT_21H);
mask &= ~(1 << irqnum);
outportb(PIC_PORT_21H, mask);
}
void closepic(int irqnum)
{
BYTE mask;
mask = inportb(PIC_PORT_21H);
mask |= (1 << irqnum);
outportb(PIC_PORT_21H, mask);
}
void picintdone(void)
{
outportb(PIC_PORT_20H, PIC_EOI); /* 写中断结束命令 */
}
#else
#endif
/***********************************
sound.h
************************************/
#ifndef _SOUND_H_
#define _SOUND_H_
/* 包含头文件 */
#include <stdio.h>
#include "stdefine.h"
/* 类型定义 */
/* WAVE 对象类型定义 */
typedef struct
{
WORD wavetype; /* WAVE的类别 */
WORD channel; /* 通道数 */
WORD samplerate; /* 采样频率 */
WORD samplebits; /* 采样位数 */
DWORD datalen; /* 数据长度 */
LONG leftdatalen; /* 剩余数据长度 */
int loops; /* 播放次数 */
FILE *fp;
} WAVE, *PWAVE;
/* 函数声明 */
BOOL initsound(void);
void closesound(void);
BOOL loadwave(PWAVE pwave, char *file);
void destroywave(PWAVE pwave);
void playwave(PWAVE pwave);
void stopwave(PWAVE pwave);
void pausewave(PWAVE pwave);
#endif
/************************************
sound.c
*************************************/
/* 包含头文件 */
#include <stdlib.h>
#include <conio.h>
#include <mem.h>
#include <dos.h>
#include "dsp.h"
#include "dma.h"
#include "pic.h"
#include "sound.h"
/* 预编译开关 */
/* #define _TEST_ */
#ifndef _TEST_
/* 内部常量定义 */
#define DMA_BUFFER_SIZE (8 * 1024)
/* WAVE 文件结构定义 */
typedef struct
{
char RIFF[4]; /* RIFF */
DWORD filelen; /* 文件长度 */
char WAVEfmt[8]; /* WAVEfmt */
DWORD reserved; /* 保留 */
WORD wavetype; /* WAVE的类别 */
WORD channel; /* 通道数目 */
WORD sampling; /* 采样频率 */
DWORD transpeed; /* 数据传输速率 */
WORD blkalign; /* 调整数据块 */
WORD sampbits; /* 采样位数 */
char data[4]; /* data */
DWORD datalen; /* 语音数据长度 */
BYTE *pdata; /* 数据区 */
} WAVEFILE, *PWAVEFILE;
/* 内部全局变量定义 */
DSP cursbdsp = {0};
PWAVE pcurwave = NULL;
BOOL dma_buf_flag = NULL;
BYTE far *sound_dma_buf = NULL;
static void interrupt (*old_dsp_int_handle)(void) = NULL;
/* 内部函数声明 */
static void interrupt new_dsp_int_handle(void);
static void install_dsp_int_handle(void);
static void remove_dsp_int_handle(void);
/* 函数实现 */
BOOL initsound(void)
{
sound_dma_buf = (BYTE far *)malloc(DMA_BUFFER_SIZE);
if (!sound_dma_buf) return FALSE;
initdsp(&cursbdsp);
setdspblocksize(&cursbdsp, DMA_BUFFER_SIZE / 2);
initdma8(cursbdsp.dspdma8, sound_dma_buf, DMA_BUFFER_SIZE);
initpic(cursbdsp.dspirqnum);
install_dsp_int_handle();
return TRUE;
}
void closesound(void)
{
remove_dsp_int_handle();
closepic(cursbdsp.dspirqnum);
closedma8(cursbdsp.dspdma8);
closedsp(&cursbdsp);
if (sound_dma_buf) free((void*)sound_dma_buf);
}
/* 装载WAVE 文件到 WAVE 对象 */
BOOL loadwave(PWAVE pw, char *file)
{
WAVEFILE wf;
pw->fp = fopen(file,"rb");
if (!pw->fp) return FALSE;
fread(&wf, sizeof(wf), 1, pw->fp);
pw->wavetype = wf.wavetype;
pw->channel = wf.channel;
pw->samplerate = wf.sampling;
pw->samplebits = wf.sampbits;
pw->datalen = wf.filelen - sizeof(wf) - 14;
pw->leftdatalen = wf.filelen - sizeof(wf) - 14;
fseek(pw->fp, 14, SEEK_CUR);
return TRUE;
}
/* 销毁 WAVE 对象 */
void destroywave(PWAVE pw)
{
fclose(pw->fp);
pw->fp = NULL;
}
void playwave(PWAVE pwave)
{
pcurwave = pwave;
dma_buf_flag = FALSE;
fread((void*)sound_dma_buf, DMA_BUFFER_SIZE, 1, pcurwave->fp);
initdma8(cursbdsp.dspdma8, sound_dma_buf, DMA_BUFFER_SIZE);
dspsetsamplerate(&cursbdsp, pcurwave->samplerate);
dspstartdma8(&cursbdsp);
}
void stopwave(PWAVE pwave)
{
dsppausedma8(&cursbdsp);
fseek(pcurwave->fp, sizeof(WAVEFILE) + 14, SEEK_SET);
pwave->leftdatalen = pwave->datalen;
}
void pausewave(PWAVE pwave)
{
dsppausedma8(&cursbdsp);
}
/* 内部函数实现 */
static void interrupt new_dsp_int_handle(void)
{
BOOL flag = FALSE;
pcurwave->leftdatalen -= DMA_BUFFER_SIZE / 2;
if (pcurwave->leftdatalen < DMA_BUFFER_SIZE / 2)
{
pcurwave->loops--;
stopwave(pcurwave);
flag = TRUE;
}
else
{
fread((void*)(sound_dma_buf + dma_buf_flag * DMA_BUFFER_SIZE / 2),
1, DMA_BUFFER_SIZE / 2, pcurwave->fp);
dma_buf_flag = ! dma_buf_flag;
}
dspintdone(&cursbdsp);
picintdone();
if (flag && pcurwave->loops != 0) playwave(pcurwave);
}
static void install_dsp_int_handle(void)
{
old_dsp_int_handle = getvect(cursbdsp.dspirqnum + 8);
setvect(cursbdsp.dspirqnum + 8, new_dsp_int_handle);
}
static void remove_dsp_int_handle(void)
{
setvect(cursbdsp.dspirqnum + 8, old_dsp_int_handle);
old_dsp_int_handle = NULL;
}
void main(void)
{
WAVE mywave = {0};
initsound();
loadwave(&mywave, "test.wav");
mywave.loops = -1;
playwave(&mywave);
getch();
destroywave(&mywave);
closesound();
}
#else
#endif
/***************************
STDEFINE.H
*************************/
/* 标准头文件 */
#ifndef _STDEFINE_H_
#define _STDEFINE_H_
/* 常量定义 */
#define TRUE 1
#define FALSE 0
/* 标准的类型定义 */
typedef int BOOL;
typedef unsigned char BYTE;
typedef unsigned short WORD;
typedef unsigned long DWORD;
typedef long int LONG;
/* 定义常用的宏 */
#define LOWBYTE(value) ( (BYTE) ((value) & 0x00FF) )
#define HIBYTE(value) ( (BYTE) ((value) >> 8) )
#define LOWWORD(value) ( (WORD) ((value) & 0xFFFF) )
#define HIWORD(value) ( (WORD) ((value) >> 16) )
#define MAKEWORD(hi, low) ( (WORD) (((hi)<<8)|(low)) )
#endif
调试好长时没生音,或者咔咔响.......谁能解决一下..感激不尽