求教高手 关于C播放wav问题


最近在网上查了好多关于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

 

 


调试好长时没生音,或者咔咔响.......谁能解决一下..感激不尽

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值