激情欧美日韩一区二区,浪货撅高贱屁股求主人调教视频,精品无码成人片一区二区98,国产高清av在线播放,色翁荡息又大又硬又粗视频

在 DOS 下使用Windows *.WAV 文件

時(shí)間:2024-09-27 11:34:49 計算機畢業(yè)論文 我要投稿
  • 相關(guān)推薦

在 DOS 下使用Windows *.WAV 文件

摘 要 該文介紹了Windows聲波文件(*.WAV)的格式,然后分析了在DOS下不使用聲音適配卡播放聲波文件的關(guān)鍵問(wèn)題,并給出了程序清單。

關(guān)鍵詞 DOS應用軟件開(kāi)發(fā) 多媒體聲波文件在DOS應用軟件開(kāi)發(fā)過(guò)程中,我們非常希望能在不附加任何硬件設備的條件下實(shí)現一些簡(jiǎn)單的多媒體功能。

過(guò)去許多文章中都討論過(guò)Windows圖像文件(*.BMP,*.PCX)的格式及其用于美化DOS程序界面的方法。在MS WIMDOWS3.1以后,Windows又提供了標準的聲波文件(*.WAV),因此我們可以利用已有的聲波文件鑲嵌在自己的軟件中,在DOS下實(shí)現語(yǔ)音或其它音響的播放,提高我們的軟件質(zhì)量。

一、聲波文件格式分析

*.WAV文件作為多媒體中使用的聲波文件格式之一,它是以RIFF格式為標準的。RIFF是英文Resource Interchange File Format的縮寫(xiě),每個(gè)WAV文件的頭四個(gè)字節便是“RIFF”。
常見(jiàn)的聲波文件主要有兩種,分別對應于單聲道(11.025KHz采樣率、8Bit的采樣值)和雙聲道(44.1KHz采樣率、16Bit的采樣值)。這里,采樣率是指:聲波信號[模→數]轉換過(guò)程中單位時(shí)間內采樣的次數。采樣值是指每一次采樣周期內聲波模擬信號的積分值,在編程播放過(guò)程中我們認為它是揚聲器在此周期單位時(shí)間段的音量。
*.WAV文件由文件頭和數據體兩大部分組成。其中文件頭又分為RIFF/WAV文件標識段和聲波數據格式說(shuō)明段兩部分。
WAV文件各部分內容及格式見(jiàn)附表。
對于單聲道聲波文件,采樣數據為八位的短整數(short int 00H-FFH);而對于雙聲道立體聲聲波文件,每次采樣數據為一個(gè)16位的整數(int),高八位和低八位分別代表左右兩個(gè)聲道。
@@03A04400.GIF;*.WAV文件格式說(shuō)明表@@

二、WAV文件編程

在沒(méi)有聲音適配卡的條件下,利用PC機內部揚聲器發(fā)聲需解決幾個(gè)關(guān)鍵問(wèn)題。
首先是如何產(chǎn)生按指定采樣率要求的標準時(shí)間間隔段,以此為基礎控制揚聲器發(fā)聲。
由于此時(shí)間段要求精確且非常短暫,因此實(shí)現起來(lái)有一定的難度。解決該問(wèn)題的思路是修改8253定時(shí)器芯片的計數器0(地址:040H)的初始值,改變系統時(shí)鐘中斷頻率使其和采樣率相一致,建立用戶(hù)的時(shí)鐘中斷例程,最終產(chǎn)生標準的時(shí)間間隔段。但是在我們修改原有系統時(shí)鐘中斷(Int 08H)以后,最終必須恢復原有18.2Hz的系統時(shí)鐘中斷。
其次是如何快速地打開(kāi)和關(guān)閉揚聲器。解決這個(gè)問(wèn)題的方法是直接向8255芯片端口(地址:061H)寫(xiě)操作。由于PC機機內揚聲器發(fā)聲只有開(kāi)/閉兩種狀態(tài),并不能控制音量大小。
因此還須考慮如何通過(guò)開(kāi)閉揚聲器來(lái)摸擬實(shí)現音量大小的控制。實(shí)現方法是:在每個(gè)時(shí)間單位內通過(guò)改變揚聲器打開(kāi)延時(shí)的長(cháng)短代表音量的大小。例如:對于8Bit單聲道聲波文件,采樣數據的最大值是0FFH,那么在每個(gè)標準時(shí)間單位內揚聲器打開(kāi)時(shí)間應為Delay=(采樣值/256)*標準時(shí)間段長(cháng)度。在此思想下可以將該方法簡(jiǎn)化,設揚聲器延時(shí)只有0、1(時(shí)間單位)兩種情況,即在每個(gè)時(shí)間單位內,如果采樣值大于128則發(fā)聲,如果采樣值小于128就不發(fā)聲。顯然這樣做是以?huà)仐壌罅柯暡ㄐ畔榇鷥r(jià)的,采用的信息量只占原有用信息的1/12
8,所以這種方法產(chǎn)生的音質(zhì)較差。

三、程序實(shí)例

下面是一個(gè)能播放11.025KHz/8Bit/單聲道聲波文件的演示程序。關(guān)于使用*.WAV文件的其它細節,可通過(guò)閱讀本程序得到。它采用了第二種延時(shí)方式,如果讀者有興趣提高音質(zhì)可將其改成使用第一種方法,只需將newint08h中的聲音開(kāi)/關(guān)判斷(與128比較)部分改成循環(huán)等待即可。
循環(huán)次數通過(guò)i=int(vol[counter]/256)*MAXTIMES得到。
式中MAXTIMES為延長(cháng)一個(gè)標準時(shí)間單位的循環(huán)次數。
程度運行環(huán)境: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()
{ /*用戶(hù)中斷例程*/
if(running)
{

unsigned int i;
disable();/*屏蔽中斷*/
running=0;
if(vol[counter]>=128)
{
i=inportb(0x61);/*開(kāi)揚*/
i=i|0x03;
outportb(0x61,i);/*聲器*/
}


else
{
i=inportb(0x61);/*關(guān)揚*/
i=i&0x00fc;
outportb(0x61,i);/*聲器*/
}
counter+=1;
enable();/*打開(kāi)中斷*/
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)/*的時(shí)鐘中*/
outport(0x40,0);/*斷頻率*/
i=inportb(0x61);/*關(guān)揚*/
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;jclose(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;
}
}
}

【在 DOS 下使用Windows *.WAV 文件】相關(guān)文章:

DOS下DSP播音的編程03-03

Windows環(huán)境下對象的鏈接與嵌入03-16

DOS界面下通用圖形編輯軟件的設計03-06

用Windows終端仿真程序實(shí)現微機遠程文件傳送03-18

Windows 95下智能數據采集系統03-19

DOS真彩色模式下真彩色圖像顯示技術(shù)03-03

Windows CE環(huán)境下無(wú)線(xiàn)網(wǎng)卡的自動(dòng)安裝03-19

windows nt環(huán)境下fddi網(wǎng)卡驅動(dòng)程序設計03-18

DOS用戶(hù)界面的設計03-20

激情欧美日韩一区二区,浪货撅高贱屁股求主人调教视频,精品无码成人片一区二区98,国产高清av在线播放,色翁荡息又大又硬又粗视频