| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 970 人关注过本帖
标题:大家好,为什么我的这个程序播不出WAV的音乐啊?但是可以运行
只看楼主 加入收藏
我是东东东
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2013-10-3
结帖率:0
收藏
已结贴  问题点数:20 回复次数:3 
大家好,为什么我的这个程序播不出WAV的音乐啊?但是可以运行
#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  install_DSP();
int  RestDSP(int Test);
WAV  *  Load_wav(char *name_wav);
void  Play_wav(WAV *Wav_file);
int  WriteDSP(int value);
void  Destroy_wav(WAV *Wav_file);




/***********************************************全局变量的定义********************************************/

int G_base; /* 记录DSP芯片的基址 */
int G_port; /* 端口的基址 */





/****************************************************DSP初始化函数*****************************************/
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文件函数******************************************/
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);           //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;
    long i=0;
    long count=0; /* 记录共分为几块播放 */
    long romd=0; /* 记录不满一块的数据段长度,以便最后依次播放 */
/* 获取块数,和余数 */
    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);
    }
    //printf("chu  shi hua ok");      OK
/* 加载声音文件 */
    if ((Wav_file = Load_wav("c:\\ckese\\fasheng\\a.WAV")) == NULL)
    {
        printf("can't load wav!");
        getch();
        return(0);
    }
    //printf("jia zai ok");               OK
    Play_wav(Wav_file); /* 播放文件 */
    //printf("bo fang ok");
    getch();
    Destroy_wav(Wav_file); /* 销毁文件 */
    //printf("xiao hui ok");                  OK
}
求救啊,马上就要验收了!!!!!
搜索更多相关主题的帖子: include channels 音乐 信息 
2013-10-03 17:59
我是东东东
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2013-10-3
收藏
得分:0 
跟大家说一下,我知道问题了,因为我没有延时!用个延时就可以了
2013-10-04 00:21
qunxingw
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:贵宾
威 望:24
帖 子:1676
专家分:7295
注 册:2011-6-30
收藏
得分:20 
这要些什么基础,看不懂

www.qunxingw.wang
2013-10-05 14:37
tangfan518
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2017-10-15
收藏
得分:0 
2017-10-15 10:29
快速回复:大家好,为什么我的这个程序播不出WAV的音乐啊?但是可以运行
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.032881 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved