论文网首页|会计论文|管理论文|计算机论文|医药学|经济学论文|法学论文|社会学论文|文学论文|教育论文|理学论文|工学论文|艺术论文|哲学论文|文化论文|外语论文|论文格式
中国论文网

用户注册

设为首页

您现在的位置: 中国论文网 >> 计算机论文 >> 计算机应用论文 >> 正文 会员中心
 计算机应用论文   计算机理论论文   计算机网络论文   电子商务论文   软件工程论文   操作系统论文   通信技术论文
在 DOS 下使用Windows *.WAV 文件

摘 要 该文介绍了windows声波文件(*.wav)的格式,然后分析了在dos下不使用声音适配卡播放声波文件的关键问题,并给出了程序清单。

关键词 dos应用软件开发 多媒体声波文件在dos应用软件开发过程中,我们非常希望能在不附加任何硬件设备的条件下实现一些简单的多媒体功能。

过去许多文章中都讨论过windows图像文件(*.bmp,*.pcx)的格式及其用于美化dos程序界面的方法。在ms wimdows3.1以后,windows又提供了标准的声波文件(*.wav),因此我们可以利用已有的声波文件镶嵌在自己的软件中,在dos下实现语音或其它音响的播放,提高我们的软件质量。

一、声波文件格式分析

*.wav文件作为多媒体中使用的声波文件格式之一,它是以riff格式为标准的。riff是英文resource interchange file format的缩写,每个wav文件的头四个字节便是“riff”。
常见的声波文件主要有两种,分别对应于单声道(11.025khz采样率、8bit的采样值)和双声道(44.1khz采样率、16bit的采样值)。这里,采样率是指:声波信号[模→数]转换过程中单位时间内采样的次数。采样值是指每一次采样周期内声波模拟信号的积分值,在编程播放过程中我们认为它是扬声器在此周期单位时间段的音量。
*.wav文件由文件头和数据体两大部分组成。其中文件头又分为riff/wav文件标识段和声波数据格式说明段两部分。Www.11665.CoM
wav文件各部分内容及格式见附表。
对于单声道声波文件,采样数据为八位的短整数(short int 00h-ffh);而对于双声道立体声声波文件,每次采样数据为一个16位的整数(int),高八位和低八位分别代表左右两个声道。
@@03a04400.gif;*.wav文件格式说明表@@

二、wav文件编程

在没有声音适配卡的条件下,利用pc机内部扬声器发声需解决几个关键问题。
首先是如何产生按指定采样率要求的标准时间间隔段,以此为基础控制扬声器发声。
由于此时间段要求精确且非常短暂,因此实现起来有一定的难度。解决该问题的思路是修改8253定时器芯片的计数器0(地址:040h)的初始值,改变系统时钟中断频率使其和采样率相一致,建立用户的时钟中断例程,最终产生标准的时间间隔段。但是在我们修改原有系统时钟中断(int 08h)以后,最终必须恢复原有18.2hz的系统时钟中断。
其次是如何快速地打开和关闭扬声器。解决这个问题的方法是直接向8255芯片端口(地址:061h)写操作。由于pc机机内扬声器发声只有开/闭两种状态,并不能控制音量大小。
因此还须考虑如何通过开闭扬声器来摸拟实现音量大小的控制。实现方法是:在每个时间单位内通过改变扬声器打开延时的长短代表音量的大小。例如:对于8bit单声道声波文件,采样数据的最大值是0ffh,那么在每个标准时间单位内扬声器打开时间应为delay=(采样值/256)*标准时间段长度。在此思想下可以将该方法简化,设扬声器延时只有0、1(时间单位)两种情况,即在每个时间单位内,如果采样值大于128则发声,如果采样值小于128就不发声。显然这样做是以抛弃大量声波信息为代价的,采用的信息量只占原有用信息的1/12
8,所以这种方法产生的音质较差。

三、程序实例

下面是一个能播放11.025khz/8bit/单声道声波文件的演示程序。关于使用*.wav文件的其它细节,可通过阅读本程序得到。它采用了第二种延时方式,如果读者有兴趣提高音质可将其改成使用第一种方法,只需将newint08h中的声音开/关判断(与128比较)部分改成循环等待即可。
循环次数通过i=int(vol[counter]/256)*maxtimes得到。
式中maxtimes为延长一个标准时间单位的循环次数。
程度运行环境:486兼容机,ms dos6.0,tc2.0编译系统。
/*/*/*
*.wav文件播放程序 demo.c,石宁 1994.12
*/*/*/
#include "dos.h"
#include "stdio.h"
#include"string.h"
#define maxsize 50000
struct wave-file_head /*声波*/
{ /*文件头*/
char riff_id[4];/*结构体*/
long int size0;
char wave-fmt[8];
lont int sizel;
int fmttag;
int channel;
long int samplespersec;
long int bytepersec;
int blockalign;
int bitpersamples;
} filehead;
long int datasize, counter=0;
unsigned char vol[maxsize];
unsigned clkdiv;
int oldclk=0,running=1;
void soundon();
void soundoff();
void interrupt(*oldint8h)();
void interrupt newint8h()
{ /*用户中断例程*/
if(running)
{

unsigned int i;
disable();/*屏蔽中断*/
running=0;
if(vol[counter]>=128)
{
i=inportb(0x61);/*开扬*/
i=i|0x03;
outportb(0x61,i);/*声器*/
}
else
{
i=inportb(0x61);/*关扬*/
i=i&0x00fc;
outportb(0x61,i);/*声器*/
}
counter+=1;
enable();/*打开中断*/
if(counter>=datasize) counter=0;
outportb(0x20,0x20);
running=1;
}
}
void soundon()
{
clkdiv=1193180/filehead.samplespersec;
/*计算8253计数器0初始值*/
oldint8h=getvect(0x08);/*保存旧的08h中断向量*/
setvect(0x08,newint8h);/*置新的08h中断例程*/
outportb(0x43,0xb6);/*初始化*/
outportb(0x42,1);/*8253计数器3/
outportb(0x42,0)

;/*初始值*/
outportb(0x43,0x36); /*修改8253*/
outport(0x40,clkdiv&0x00ff);/*计数器0*/
outport(0x40,(clkdiv>>8)&0x00ff);/*初始值*/
}
void soundoff()
{
int i;
setvect(0x08,oldint8h);/*恢复旧的08h中断向量*/
outportb(0x43,0x36);/*恢复正常*/
outport(0x40,0)/*的时钟中*/
outport(0x40,0);/*断频率*/
i=inportb(0x61);/*关扬*/
i=i&0x00fc;
outportb(0x61,i);/*声器*/
}
void main(int argc, char *argv[])
{
long j;
int key;
char *s;
file *fp;/
if(argc==1)
{
printf("%s\n","and the wav filename in command line!");
exit(0);
}
else
{
if ((fp=fopen(argv[l],"rb"))==null)
{
printf("cannot open the data file %s\n",argv[1];
exit(0);
}
}
if(fread(&filehead,sizeof(struct wave-file-head),1,fp)==null)
{
printf("file read error!\n");
exit(0);
}
fseek(fp,4,seek-cur);
fread(&datasize,4,1,fp);
for(j=0;j<datasize;j++)vol[j]=getc(fp);
close(fp);
printf("%s\n","now sound on, press esc to stop!");
soundon();
for(;;)
{
key=getch();
if(key==27)
{
soundoff();
printf("%s\n","sound off!");
break;
}
}
}

  • 上一个计算机论文:
  • 下一个计算机论文:
  •  作者:石宁 侯运炳 李飓 [标签: 使用 文件 ]
    姓 名: *
    E-mail:
    评 分: 1分 2分 3分 4分 5分
    评论内容:
    发表评论请遵守中国各项有关法律法规,评论内容只代表网友个人观点,与本网站立场无关。
    浅析Mostaganem700套项目工期索赔案例
    初探WindowsServer2003操作系统的安全配置
    浅谈利用GHOST软件维护操作系统
    《中文Windows 2003操作系统》教案
    展望Dextroscope虚拟现实手术规划系统在神经
    PHOTOSHOP教学网站的应用研究
    LabWindows/CVI的应用特点
    基于RRAS与虚拟专用网技术在Windows中的实现
    微软发布Windows8操作系统
    触摸Windows8
    避免误删,找回Windows8删除文件确认对话框
    Windows8是微软的翻身之战
    | 设为首页 | 加入收藏 | 联系我们 | 网站地图 | 手机版 | 论文发表

    Copyright 2006-2013 © 毕业论文网 All rights reserved 

     [中国免费论文网]  版权所有