中文字幕在线一区二区在线,久久久精品免费观看国产,无码日日模日日碰夜夜爽,天堂av在线最新版在线,日韩美精品无码一本二本三本,麻豆精品三级国产国语,精品无码AⅤ片,国产区在线观看视频

      在 DOS 下使用Windows *.WAV 文件

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

      在 DOS 下使用Windows *.WAV 文件

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

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

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

      一、聲波文件格式分析

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

      二、WAV文件編程

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

      三、程序?qū)嵗?/p>

      下面是一個能播放11.025KHz/8Bit/單聲道聲波文件的演示程序。關(guān)于使用*.WAV文件的其它細(xì)節(jié),可通過閱讀本程序得到。它采用了第二種延時方式,如果讀者有興趣提高音質(zhì)可將其改成使用第一種方法,只需將newint08h中的聲音開/關(guān)判斷(與128比較)部分改成循環(huán)等待即可。
      循環(huán)次數(shù)通過i=int(vol[counter]/256)*MAXTIMES得到。
      式中MAXTIMES為延長一個標(biāo)準(zhǔn)時間單位的循環(huán)次數(shù)。
      程度運行環(huán)境:486兼容機,MS DOS6.0,TC2.0編譯系統(tǒng)。
      /*/*/*
      *.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];/*結(jié)構(gòu)體*/
      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);/*關(guān)揚*/
      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計數(shù)器0初始值*/
      oldint8h=getvect(0x08);/*保存舊的08H中斷向量*/
      setvect(0x08,newint8h);/*置新的08H中斷例程*/
      outportb(0x43,0xB6);/*初始化*/
      outportb(0x42,1);/*8253計數(shù)器3/
      outportb(0x42,0)

      ;/*初始值*/
      outportb(0x43,0x36); /*修改8253*/
      outport(0x40,clkdiv&0x00ff);/*計數(shù)器0*/
      outport(0x40,(clkdiv>>8)&0x00ff);/*初始值*/
      }
      void soundoff()
      {
      int i;
      setvect(0x08,oldint8h);/*恢復(fù)舊的08H中斷向量*/
      outportb(0x43,0x36);/*恢復(fù)正常*/
      outport(0x40,0)/*的時鐘中*/
      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界面下通用圖形編輯軟件的設(shè)計03-06

      用Windows終端仿真程序?qū)崿F(xiàn)微機遠(yuǎn)程文件傳送03-18

      Windows 95下智能數(shù)據(jù)采集系統(tǒng)03-19

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

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

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

      DOS用戶界面的設(shè)計03-20

      主站蜘蛛池模板: 日韩人妻一级av一区二区| 在线观看精品国产福利片87| 国产一级黄色片在线观看| 免费大学生国产在线观看p| 盐池县| 久久国产A∨一二三| 国产熟女自拍视频网站| 97人妻蜜臀中文字幕| 延川县| 日本在线免费精品视频| 不卡的亚洲av网在线| 黑人一区二区三区在线| 日韩不卡av高清中文字幕| 喀喇沁旗| 松原市| 南京市| 辽中县| 免费人成网上在线观看免费| 偃师市| 孝昌县| 高平市| 日韩精品国产一区二区| 南和县| 亚洲成A人A∨久在线观看| 固安县| 一区二区三区婷婷中文字幕| 伊人色综合九久久天天蜜桃| 少妇高潮紧爽免费观看| 望江县| 亚洲中文久久久久无码| 中超| 不卡免费av在线高清| 山西省| 国产视频在线一区二区三区四区| 车险| 国产亚洲成人精品一区| 无码啪啪熟妇人妻区| 国产三级视频在线观看视主播| 神马不卡一区二区三级| 国产综合色婷婷精品久久| 东京热男人的av天堂|